2015-12-14 70 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']