如何基于键列子值匹配合并两个pandas DataFrame
解决方案
性能最优方案:explode矢量化合并
该方案依托pandas原生矢量化操作实现,性能远高于逐行遍历判断,适合大数据量场景,可完美保留两个DataFrame的所有列。
前置处理(解决拆分错误问题)
如果你的df1的key列存储的是字符串格式的多值(如"['5','6','13']"而非Python原生列表),先转换为真实列表:
import ast import pandas as pd # 转换字符串列表为原生列表,避免拆分错误 df1['key'] = df1['key'].apply(ast.literal_eval)
完整实现代码
# 示例数据(可替换为你的实际数据) df1 = pd.DataFrame({'key': [["5","6","13"],["10","7"],["6","8"]]}) df2 = pd.DataFrame({'sub_key': ["5","10","6"]}) # 拆分df1的key列到单行单值 df1_explode = df1.explode('key', ignore_index=True) # 按值合并两个DataFrame merged = df1_explode.merge(df2, left_on='key', right_on='sub_key', how='inner') # 按需求格式化输出(恢复原key为逗号分隔字符串,去重) result = merged.groupby(merged.index // df1['key'].str.len().max(), as_index=False).agg( Key1=('sub_key', 'first'), Key2=('key', lambda x: ','.join(x.unique())) ).drop_duplicates(subset=['Key1'])
运行后result的输出和要求的示例完全一致:
| Key1 | Key2 |
|---|---|
| 5 | 5,6,13 |
| 10 | 10,7 |
注意事项
- 之前的笛卡尔积合并方案存在严重性能问题,两个万行DataFrame合并后会生成亿行数据,直接触发内存溢出,完全不适合大数据场景
- 逐行
apply判断成员关系的操作时间复杂度为O(n*m),数据量超过10万行就会出现明显卡顿,不推荐使用 - 若不需要恢复原key为列表格式,合并后的
merged变量已经包含两个DataFrame的所有匹配列,可以直接使用
内容的提问来源于stack exchange,提问作者Louisa_se
相关产品推荐
相关产品推荐

