按列表列中的常见字符串元素映射两个数据框



如果两列中的字符串元素匹配,我想映射两个数据框,我拥有的公共列是逗号分隔的字符串。我也尝试了地图功能,将其转换为字典。但它没有奏效。

df 
Text
[Temp,Temp2]
[Temp4,Temp7,Temp2]

ClusterDf
Label             Member
[Cluster1]    [Temp,Temp8]
[Cluster2]   [Temp4,Temp7]

我想要这样的输出

df 
Text                     Label  
[Temp,Temp2]             [Cluster1]  
[Temp4,Temp7,Temp2]      [Cluster2]

ClusterDf创建字典,然后按map添加新列,如果不匹配,则使用next和 iter:

d = {v: a[0] for a, b in zip(ClusterDf['Label'], ClusterDf['Member']) for v in b}
print (d)
{'Temp': 'Cluster1', 'Temp8': 'Cluster1', 'Temp4': 'Cluster2', 'Temp7': 'Cluster2'}
df['Label'] = df['Text'].map(lambda x: next(iter(d[y] for y in x if y in d), 'no match'))
print (df)
Text     Label
0          [Temp, Temp2]  Cluster1
1  [Temp4, Temp7, Temp2]  Cluster2

如果需要列表:

df['Label'] = df['Text'].map(lambda x: [next(iter(d[y] for y in x if y in d), 'no match')])
print (df)
Text       Label
0          [Temp, Temp2]  [Cluster1]
1  [Temp4, Temp7, Temp2]  [Cluster2]

如果希望所有匹配(如果存在(:

df['Label'] = df['Text'].map(lambda x: [d[y] for y in x if y in d])
print (df)
Text                 Label
0          [Temp, Temp2]            [Cluster1]
1  [Temp4, Temp7, Temp2]  [Cluster2, Cluster2]

谢谢@jezrael,第三个解决方案对我完美地工作。多谢。 你让我度过了一天

df['Label'] = df['Text'].map(lambda x: [d[y] for y in x if y in d](

最新更新