python - 熊猫在具有列表值的列上左连接
问题描述
给出这两个数据样本,我想通过一个列连接,在左连接数据框中,值是几个元素中的一个元素的列表,而在另一个数据框中是相同的列(主键),带有附加信息,没有列表作为格式.
用这个例子
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 学习。
解决方案
您应该将您的输出 [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']
推荐阅读
- facebook-graph-api - 如何深入了解 Instagram 的帖子?
- ios - 将 Swift 协议一致性添加到 Objective-C 标头并使其公开
- questdb - 在 QuestDB 导入中使用用户定义的模式手动设置时间戳格式
- c - 在 MacOS 中无法接收 GRE 数据包
- solr - SOLR 搜索,日光浴室 PHP - 了解评分
- ios - 如何在collectionview Swift中调整第二个单元格的大小?
- netbeans - 无法将 Xdebug 3.0.2 与 NetBeans 12.2、PHP 7.4、Ubuntu 20.04 一起使用
- javascript - 使用 JavaScript 转换文本字符串
- android - 从内容 URI 获取文件
- mongodb - 从 Spark 读取 MongoDB 的速度很慢 - 奇怪的任务分配