如何高效实现DataFrame按数组交集关联并分组聚合
高效实现方案
核心思路
利用Pandas的explode展开数组,通过公共元素关联两个DataFrame,再去重分组聚合,避免低效的逐行循环操作。
步骤代码
先构造示例数据:
import pandas as pd df1 = pd.DataFrame({ 'c1': [1, 8], 'c2': [2, 9], 'c3': [[1,2,3,4], [10,11]] }) df2 = pd.DataFrame({ 'c4': [3, 5], 'c5': [4, 6], 'c6': [[1,2], [2,3]] })
执行以下高效操作:
- 展开数组列:将两个DataFrame的数组列拆分为单行单元素,简化关联逻辑
df1_exp = df1.explode('c3', ignore_index=True) df2_exp = df2.explode('c6', ignore_index=True)
- 关联并去重:通过展开后的公共元素完成关联,同时去重避免同一匹配对因多个交集元素重复出现
merged = df1_exp.merge(df2_exp, left_on='c3', right_on='c6') # 保留唯一的(df1行, df2行)组合 merged_unique = merged.drop_duplicates(subset=['c1', 'c2', 'c4', 'c5'])
- 分组聚合生成结果:按
c1、c2分组,将匹配的df2行转换为字典列表存入r1列
result = merged_unique.groupby(['c1', 'c2']).apply( lambda x: x[['c4', 'c5']].to_dict('records') ).reset_index(name='r1')
最终结果
输出的result如下:
c1 c2 r1 0 1 2 [{'c4': 3, 'c5': 4}, {'c4': 5, 'c5': 6}]
性能优势
- 全程使用Pandas内置的向量化/优化方法,避免了
iterrows这类低效逐行迭代操作 - 对于数组元素较多的场景,
explode+merge的内存和时间效率远高于手动循环判断交集 - 去重步骤确保分组聚合时不会产生重复的df2行记录
内容的提问来源于stack exchange,提问作者xsa xsa
相关产品推荐
相关产品推荐

