python - 如何根据 Pandas 中的一列列表组合两个数据框
问题描述
import pandas as pd
可重现的设置
我有两个数据框:
df=\
pd.DataFrame.from_dict({'A':['xy','yx','zy','zz'],
'B':[[1, 3],[4, 3, 5],[3],[2, 6]]})
df2=\
pd.DataFrame.from_dict({'B':[1,3,4,5,6],
'C':['pq','rs','pr','qs','sp']})
df
好像:
A B
0 xy [1, 3]
1 yx [4, 3, 5]
2 zy [3]
3 zz [2, 6]
df2
好像:
B C
0 1 pq
1 3 rs
2 4 pr
3 5 qs
4 6 sp
目标
我想将这两者结合起来形成res
:
res=\
pd.DataFrame.from_dict({'A':['xy','yx','zy','zz'],
'C':['pq','pr','rs','sp']})
IE
A C
0 xy pq
1 yx pr
2 zy rs
3 zz sp
xy
带有in的行具有df
lsit [1,3]
。1
中的列B
中有一行具有值df2
。该C
列在该行中具有值pq
,因此我xy
与pq
. 接下来的两行也一样。B
最后一行: in 列中没有 2 的值df2
,所以我选择该值6
(in 中的最后一行df
有 list [2,6]
)。
问题
在不遍历数据框的情况下如何实现这一点?
一个非常相似的西班牙语 SO帖子,启发了这篇文章。
解决方案
您可以将explode
“B”分成单独的行,然后在“B”上合并并删除重复项。
非常感谢 Asish M. 在评论中指出了订购的潜在错误。
(df.explode('B')
.merge(df2, on='B', how='left')
.dropna(subset=['C'])
.drop_duplicates('A'))
A B C
0 xy 1 pq
2 yx 4 pr
5 zy 3 rs
7 zz 6 sp
理想情况下,以下应该有效:
df.explode('B').merge(df2).drop_duplicates('A')
但是,pandas(截至写作时,版本 1.2dev)不保留合并时左键的顺序,这是一个错误,请参阅GH18776。
同时,我们可以使用左合并的解决方法,如上所示。
推荐阅读
- vb.net - 读取资源文件失败
- javascript - 具有负索引的 2D 地图的 JS (ES6) JSON-Serializable 解决方案?
- javascript - knex 查询构建器和链中调用的方法的顺序
- php - 内连接查询中的条件
- xamarin - Xamarin iOS 上的背景图像
- r - 拟合 38 只股票的对数回报,具有多元偏斜 t 分布 R,打印参数错误
- css - 具有即时编辑功能的本地 wordpress 开发
- reactjs - 在 Redux 中,如何只更新状态对象的一部分?
- r - 使用嵌套循环的 R 并行处理
- java - SolrCloud 上的 Mongo 数据索引