2017-06-12 71 views
0

我想通過使用熊貓合併兩個數據集。一個是位置(經度和緯度),另一種是時間幀(0到24小時,15分鐘步驟= 96個數據點)合併/複製熊貓的兩個數據集

下面是示例代碼:

s1 = pd.Series([1, 2, 3]) 
s2 = pd.Series([4, 5, 6]) 
df = pd.DataFrame([list(s1), list(s2)], columns = ["A", "B", "C"]) 

timeframe_array=[] 
for i in range(0, 3600, timeframe): 
    timeframe_array.append(i) 

我想要得到的數據像這樣:

A B C time 
0 1 2 3  0 
1 1 2 3 15 
2 1 2 3 30 
3 1 2 3 45 
... 

我怎樣才能得到這樣的數據?

+0

通過 '合併' 你的意思是左加入?如果是這樣:'df1.join(df2,how ='left')'。 – lnNoam

+0

謝謝,但時間變量(0,15,30 ...)應該重複。抱歉,我編輯了原始問題(因爲它很難理解)。 –

+0

我仍然不完全確定你在找什麼。你想在'df'中爲每一行復制0-3600(step = 15)的時間嗎?也就是說,最後一個數據幀的總行數是'240 * 2' ='480'? – lnNoam

回答

0

雖然不是特別優雅,這應該工作:

from __future__ import division # only needed if you're using Python 2 
import pandas as pd 
from math import ceil 

# Constants 
timeframe = 15 
total_t = 3600 

創建df1

s1 = [1, 2, 3] 
s2 = [4, 5, 6] 
df1 = pd.DataFrame([s1, s2], columns=['A', 'B', 'C']) 

接下來,我們要建立df2使得序列0-3600(步驟= 15)複製的每行在df1。我們可以提取df1.shape[0](在這種情況下爲2)的行數。

df2 = pd.DataFrame({'time': range(0, total_t * df1.shape[0], timeframe)}) 

接下來,你需要複製在df1行匹配df2

factor = ceil(df2.shape[0]/df1.shape[0]) 
df1_f = pd.concat([df1] * factor).sort_index().reset_index(drop=True) 

最後,將兩個數據框連接在一起並裁掉多餘的行。

df3 = df1_f.join(df2, how='left')[:df2.shape[0]] 

Pandas可能有一個內置的方式做到這一點,但據我所知,這兩個joinmerge只能由具有恆定(默認NaN)灌裝彌補行的差異。


結果:

>>> print(df3.head(4)) 

    A B C time 
0 1 2 3  0 
1 1 2 3 15 
2 1 2 3 30 
3 1 2 3 45 

>>> print(df3.tail(4)) 

    A B C time 
476 4 5 6 7140 
477 4 5 6 7155 
478 4 5 6 7170 
479 4 5 6 7185 

>>> df3.shape # (480, 4)