2015-12-14 56 views
0

n數據幀數nCity列數。熊貓 - 合併和Groupby不同的數據幀並創建新列

DF1:

ID  City  City1 City2  .... CityN 
444x Lima    DC 
222x Rica  Dallas 
555x Rio  London 
333x NYC  Tokyo 
777x SF     Nairobi 

DF2:

ID  City  City1 City2  .... CityN 
000x Lima    Miami 
888x Cct  Texas 
999x Delhi 
444x Tokyo  Ktm 
333x Aus     Paris 

DFN:

ID  City  City1 City2  .... CityN 
444x Lima    DC 
333x Rica  Dallas 
555x Rio  London 
666x NYC  Tokyo 
777x SF     Nairobi 

我曾嘗試合併dataframes一個接一個,但City列值獲得通過的最後一個覆蓋數據幀值。

dfOutput=df1.merge(df2, how='left', on='ID')

我想什麼是保留所有這些City1, City2, ...CityN列值。我列出了下面的示例輸出。

ID  City1 City2 City3 City4  City5  City6 
444x Tokyo  Lima  DC  Miami  Ktm 
333x NYC  Tokyo  Aus  Paris Rica  Dallas 

等等其餘IDs。我也嘗試在SO中使用另一個問題提供的groupbyID

cities = df.groupby('ID')['City'].apply(lambda x: pd.Series([city for city in x])).unstack()

感謝您的幫助。

+0

哪裏是KTM爲444X? – itzy

+0

謝謝@itzy,編輯它。我有一些敏感的值,所以必須使用佔位符值。 – everestbaker

+0

看起來你只想爲每個ID設定獨特的城市。可能會更簡單,只需遍歷行並將值讀入字典中,然後在最後創建一個DataFrame。 – itzy

回答

0

IIUC你可以使用pd.merge沒有left參數:

In [14]: df1 
Out[14]: 
    ID City City1 City2 
0 444x Lima  -  DC 
1 222x Rica Dallas  - 
2 555x Rio London  - 
3 333x NYC Tokyo  - 
4 777x SF  - Nairobi 

In [15]: df2 
Out[15]: 
    ID City City1 City2 
0 000x Lima  - Miami 
1 888x Cct Texas  - 
2 999x Delhi  -  - 
3 444x Tokyo Ktm  - 
4 333x Aus  - Paris 

In [16]: pd.merge(df1, df2, on='ID') 
Out[16]: 
    ID City_x City1_x City2_x City_y City1_y City2_y 
0 444x Lima  -  DC Tokyo  Ktm  - 
1 333x NYC Tokyo  - Aus  - Paris 

然後,你可以對所產生的數據框重命名列:

cols = ['ID'] + ['City' + str(i) for i in range(1, len(df3.columns))] 

In [21]: cols 
Out[21]: ['ID', 'City1', 'City2', 'City3', 'City4', 'City5', 'City6']