2015-02-08 37 views
0

我想要將兩個日期框架與左連接一起連接,但希望每個匹配的項目都只能連接到生成的日期框架中的一行。python熊貓加入到一行

例如

df1: 

company, clientid 
tesco, 1 
argos, 2 
MnS,  3 

df2: 

info, clientid 
a, 1 
b, 1 
c, 1 
d, 2 
g, 3 
z, 5 

想要的結果:

company, clientid, info, info, info 
tesco, 1,  a, b, c 
argos, 2,  d 
MnS,  3,  g 

使用:

pd.merge(df1, df2, on='clientid', how='left') 

導致在DF1行被複制的合併工作創造什麼,我會稱之爲單文件,而不是我想要的平面文件。

回答

1

我們可以groupby'clientid',然後從唯一值創建一個系列並調用reset_index。這將創建一個帶有info列的df作爲我們需要重命名的ordinal int值。

然後,我們可以合併這回原來的DF:

In [42]: 

df_info = df1.groupby('clientid')['info'].unique().apply(pd.Series).reset_index() 
info_len = len([col for col in df_info if str(col).isdigit()]) 
df_info.columns = ['clientid'] + ['info'] * info_len 
df_info 
Out[42]: 
    clientid info info info 
0   1 a b c 
1   2 d NaN NaN 
2   3 g NaN NaN 
3   5 z NaN NaN 
In [43]: 

df.merge(df_info, on='clientid', how='left') 
Out[43]: 
    company clientid info info info 
0 tesco   1 a b c 
1 argos   2 d NaN NaN 
2  MnS   3 g NaN NaN 

打破個人GROUPBY操作證明了這種情況:

In [44]: 

df1.groupby('clientid')['info'].unique() 
Out[44]: 
clientid 
1   [a, b, c] 
2     [d] 
3     [g] 
5     [z] 
Name: info, dtype: object 
In [45]: 

df1.groupby('clientid')['info'].unique().apply(pd.Series) 
Out[45]: 
      0 1 2 
clientid    
1   a b c 
2   d NaN NaN 
3   g NaN NaN 
5   z NaN NaN 
In [46]: 

df1.groupby('clientid')['info'].unique().apply(pd.Series).reset_index() 
Out[46]: 
    clientid 0 1 2 
0   1 a b c 
1   2 d NaN NaN 
2   3 g NaN NaN 
3   5 z NaN NaN 

代碼的下面其餘的上述應不言自明

+0

你的方法運作良好。但是當df1中有多個列時,我正努力應用它。 – thefebruaryman 2015-02-09 08:15:21

+0

你可以編輯你的文章樣本數據和代碼來解釋你的問題 – EdChum 2015-02-09 09:59:17