2017-08-30 57 views
0

我有兩個Pandas DataFrames,其數據來自不同的源,但兩個DataFrames都有相同的列名。合併時只有一列保留名稱。將兩個熊貓DataFrame組合成一個新的

像這樣:

speed_df = pd.DataFrame.from_dict({ 
    'ts': [0,1,3,4], 
    'val': [5,4,2,1] 
    }) 

temp_df = pd.DataFrame.from_dict({ 
    'ts': [0,1,2], 
    'val': [9,8,7] 
    }) 

,我需要有這樣的結果:

final_df = pd.DataFrame.from_dict({ 
    'ts': [0,1,2,3,4], 
    'speed': [5,4,NaN,1], 
    'temp': [9,8,7,NaN,NaN] 
    }) 

後來,我將處理空單元格(這裏充滿NAN)通過複製的值先前的有效值。而得到的東西是這樣的:

final_df = pd.DataFrame.from_dict({ 
    'ts': [0,1,2,3,4], 
    'speed': [5,4,4,1], 
    'temp': [9,8,7,7,7] 
    }) 

回答

5

使用pd.merge

In [406]: (pd.merge(speed_df, temp_df, how='outer', on='ts') 
      .rename(columns={'val_x': 'speed','val_y': 'temp'}) 
      .sort_values(by='ts')) 
Out[406]: 
    ts speed temp 
0 0 5.0 9.0 
1 1 4.0 8.0 
4 2 NaN 7.0 
2 3 2.0 NaN 
3 4 1.0 NaN 

In [407]: (pd.merge(speed_df, temp_df, how='outer', on='ts') 
      .rename(columns={'val_x': 'speed', 'val_y': 'temp'}) 
      .sort_values(by='ts').ffill()) 
Out[407]: 
    ts speed temp 
0 0 5.0 9.0 
1 1 4.0 8.0 
4 2 4.0 7.0 
2 3 2.0 7.0 
3 4 1.0 7.0 
+0

謝謝!這正是需要的。 – ulitosCoder

0

兩個主要數據框中選擇,一種是pd.merge,另一個是pd.fillna。這裏是代碼:

df = speed_df.merge(temp_df, how='outer', on='ts') 
df = df.rename(columns=dict(val_x='speed', val_y='temp')) 
df = df.sort_values('ts') 
df.fillna(method='ffill') 

希望這會有所幫助。

感謝

+0

這與@ JohnGalt的回答一致 – piRSquared

-1

你需要做一個左外連接使用pandas.merge功能

d = pd.merge(speed_df,temp_df,on='ts',how='outer').rename(columns=\ 
{'val_x':'speed','val_y':'temp'}) 
d = d.sort_values('ts') 
d['speed']=d['speed'].fillna(4) 
d['temp']=d['temp'].fillna(7) 

應該返回你:

enter image description here