我想加入以下两个数据框。
第一个数据帧在一列中有多个键
>>> 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
答案 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