如何在Pandas中基于列表列的任意匹配项合并两个DataFrame?
如何在Pandas中基于列表列的任意匹配项合并两个DataFrame?
嗨,这个需求我之前也碰到过,Pandas自带的merge方法确实没法直接处理列表列与单个值列的匹配,不过咱们完全不用自己写复杂函数,用两步简单操作就能搞定!
解决思路
核心思路是先把包含列表的列"拆展开",让每个列表元素单独占一行,这样就能用常规的merge方法完成匹配了,具体步骤如下:
- 展开列表列:用
explode()方法把第一个DataFrame中包含列表的列拆成多行,每行对应一个列表元素 - 常规合并:基于展开后的单列和第二个DataFrame的目标列进行合并
- 整理结果:调整列顺序,去掉不需要的中间列(可选)
代码示例
先构造你给出的示例数据:
import pandas as pd # 第一个包含列表列的DataFrame df1 = pd.DataFrame({ 'Column A': ['a', 'b'], 'Column B': [['val1', 'val2', 'val3'], ['val4', 'val5']] }) # 第二个用于匹配的DataFrame df2 = pd.DataFrame({ 'Column C': ['x', 'y'], 'Column D': ['val1', 'val4'] })
第一步,展开df1的列表列:
# 把Column B的列表拆成单独行 df1_exploded = df1.explode('Column B')
展开后的df1_exploded会变成这样:
| Column A | Column B |
|---|---|
| a | val1 |
| a | val2 |
| a | val3 |
| b | val4 |
| b | val5 |
第二步,执行合并操作:
# 基于展开后的Column B和df2的Column D匹配 merged_df = pd.merge(df1_exploded, df2, left_on='Column B', right_on='Column D')
第三步,整理成你想要的列顺序:
# 选择需要的列并调整顺序 final_df = merged_df[['Column A', 'Column D', 'Column C']]
最终得到的结果就是你期望的样子:
| Column A | Column D | Column C |
|---|---|---|
| a | val1 | x |
| b | val4 | y |
补充说明
如果你的数据集比较大,explode()会暂时增加行数,但后续的merge会自动过滤掉不匹配的行,整体效率比自定义函数要高很多,而且代码简洁易维护~
备注:内容来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

