【问题标题】:Map two data frames by common string elements from List column通过 List 列中的常见字符串元素映射两个数据框
【发布时间】: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]

【问题讨论】:

    标签: pandas dictionary merge


    【解决方案1】:

    通过ClusterDf 创建字典,然后通过mapnext 添加新列,如果不匹配则迭代:

    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])

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多