Pandas - Merge和Groupby不同的数据帧并创建新列

时间:2015-12-14 19:05:15

标签: python pandas group-by

拥有 n nCity列数据的数据帧。

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

我尝试逐个合并数据帧,但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()

感谢您的帮助。

1 个答案:

答案 0 :(得分: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']