您能否在连接列之一中使用多个键来连接数据框?

时间:2019-03-31 17:29:51

标签: python pandas dataframe

我想加入以下两个数据框。

第一个数据帧在一列中有多个键

>>> import pandas as pd
>>> df = pd.DataFrame(data={'col1': [1,2,3], 'key': ['x, y','y', 'z, x']})
>>> df
   col1   key
0     1  x, y
1     2     y
2     3  z, x

对于第一个数据帧中的每个键,我在第二个数据帧中具有各种映射。像这样:

>>> df2 = pd.DataFrame(data= {'key': ['x','y','z'], 'value': ["v1,v2, 
v3","v4,v3", "v5"]})

>>> df2
  key      value
0   x  v1,v2, v3
1   y      v4,v3
2   z         v5

我想在一列中将所有值都放在其对应键旁边。理想情况下,如col1中那样删除重复项(x和y都具有v3)。

>>> df3
   col1   key           value
0     1  x, y  v1, v2, v3, v4
1     2     y          v4, v3
2     3  z, x  v1, v2, v3, v5

3 个答案:

答案 0 :(得分:4)

检查

d=dict(zip(df2.key,df2.value))
df['New']=[','.join([d.get(y) for y in x.split(', ')]) for x in df.key]

现在我们删除重复的

df.New=df.New.str.split(',').apply(lambda x : ','.join(set(x)))
df
   col1   key          New
0     1  x, y  v3,v1,v2,v4
1     2     y        v3,v4
2     3  z, x  v5,v3,v1,v2

答案 1 :(得分:3)

简单的循环

for k,v in zip(df2.key, df2.value): 
    df.key = df.key.str.replace(k,v)

输出

    col1    key
0   1       v1,v2, v3, v4,v3
1   2       v4,v3
2   3       v5, v1,v2, v3

要删除重复项,可以transform

df.key.transform(lambda s: sorted(set([k.strip() for k in s.split(',')])))

    col1    key
0   1       [v1, v2, v3, v4]
1   2       [v3, v4]
2   3       [v1, v2, v3, v5]

答案 2 :(得分:1)

首先,我们将您的值嵌套(拆分)到行中:

df_new= pd.concat([pd.Series(row['col1'], row['key'].split(','))              
                    for _, row in df.iterrows()]).reset_index().rename({0:'col1', 'index':'key'},axis=1)

print(df_new)
  key  col1
0   x     1
1   y     1
2   y     2
3   z     3
4   x     3

然后,我们将key列和groupby列上的值合并在一起,以汇总到col1上:

df_final = pd.merge(df_new,df2, on='key',how='left')
df_final = df_final.groupby('col1').agg(', '.join).reset_index()

print(df_final)

   col1   key             value
0     1  x, y  v1,v2, v3, v4,v3
1     2     y             v4,v3
2     3  z, x     v5, v1,v2, v3