通过 List 列中的常见字符串元素映射两个数据框
Posted
技术标签:
【中文标题】通过 List 列中的常见字符串元素映射两个数据框【英文标题】:Map two data frames by common string elements from List column 【发布时间】:2020-04-21 18:22:54 【问题描述】:如果两列中的字符串元素匹配,我想映射两个数据框,我拥有的公共列是用逗号分隔的字符串。我也尝试将地图功能转换为字典。但它没有奏效。
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]
【问题讨论】:
【参考方案1】:通过ClusterDf
创建字典,然后通过map
和next
添加新列,如果不匹配则迭代:
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]
【讨论】:
【参考方案2】:感谢@jezrael,第三个解决方案对我来说非常有效。非常感谢。 你让我开心
df['Label'] = df['Text'].map(lambda x: [d[y] for y in x if y in d])
【讨论】:
以上是关于通过 List 列中的常见字符串元素映射两个数据框的主要内容,如果未能解决你的问题,请参考以下文章