首页 > 解决方案 > 熊猫在具有列表值的列上左连接

问题描述

给出这两个数据样本,我想通过一个列连接,在左连接数据框中,值是几个元素中的一个元素的列表,而在另一个数据框中是相同的列(主键),带有附加信息,没有列表作为格式.

用这个例子

df1 = pd.DataFrame({'ID':[[1111],[2222,3333],[4444,5555],[6666]],'NAME':['foo','bar','zoo','bahh']})
df2 = pd.DataFrame({'ID':[[1111],[2222],[3333],[4444],[5555],[7777]],'ALT_NAME':['foo_alt','bar_alt','zoo_alt','baoo','razz','foo fi']})
    print(df1)
    print(df2)

输出[1]:

    ID              NAME
0   [1111]          foo
1   [2222, 3333]    bar
2   [4444, 5555]    zoo
3   [6666]          bahh

输出[2]:

    ALT_NAME    ID
0   foo_alt     [1111]
1   bar_alt     [2222]
2   wis_alt     [3333]
3   baoo        [4444]
4   razz        [5555]
5   foo fi      [7777]

结果应该是:

    ID              NAME    ALT NAME
0   [1111]          foo     [foo_alt]       
1   [2222, 3333]    bar     [bar_alt , wis_alt]
2   [4444, 5555]    zoo     [baoo, razz]        
3   [6666]          bahh    nan

建议的解决方案:

我可以通过将 ID 拆分为几列并进行多个左连接来解决它,但我希望找到更在线或更智能的解决方案。所以,这个问题的本质是更面向 Python 学习。

标签: pythonpandas

解决方案


您应该将您的输出 [2] 转换为地图(熊猫系列),例如:

df2.ID = df2.ID.apply(lambda x: x[0])
s2 = df2.set_index('ID')['ALT_NAME'] # let us rename it s2 as it is a series now!

完成后,您可以简单地使用 apply 并通过列表理解获取值:

df1['ALT NAME'] = df1.ID.apply(lambda x: [s2.get(i,None) for i in x])
print(df1)

回报:

             ID  NAME            ALT NAME
0        [1111]   foo           [foo_alt]
1  [2222, 3333]   bar  [bar_alt, zoo_alt]
2  [4444, 5555]   zoo        [baoo, razz]
3        [6666]  bahh              [None]

小评论:这不会给你nan最后一行。但是,如果您有 1 个匹配项和 1 个无匹配项,那不是 [match1, None] 吗?

转换为 s2 后的 Df2:

ID
1111    foo_alt
2222    bar_alt
3333    zoo_alt
4444       baoo
5555       razz
7777     foo fi

单排版:s2 = df2.assign(ID=df2.ID.apply(lambda x: x[0])).set_index('ID')['ALT_NAME']


推荐阅读