You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含重复Device_ID的大Pandas DataFrame高效合并方法咨询

高效合并含重复关联键的大DataFrame

我之前也碰到过一模一样的问题——当DataFrame里的关联键(比如你的Device_ID)有大量重复值时,常规的merge或join会因为生成笛卡尔积(把每个重复的键对应的行两两匹配)而导致计算量爆炸,耗时自然久得离谱。你的需求是把每个Device_ID下的行按出现顺序一一对应合并,对吧?这里有个精准又高效的解决方案:

核心思路:给重复键添加组内序号

给每个Device_ID的重复行添加一个组内递增的序号(比如row_num),这样Device_ID + row_num就成了唯一的匹配键,合并时就能实现一对一精准匹配,彻底避免笛卡尔积的问题。

完整代码示例

import pandas as pd

# 你的示例数据
df_1 = pd.DataFrame({'Device_ID':[1001,1034,1223,1001],'Col_A':[45,56,78,33]})
df_2 = pd.DataFrame({'Device_ID':[1001,1034,1223,1001,1887],'Col_B':[35,46,78,33,66]})
df_3 = pd.DataFrame({'Device_ID':[1001,1034,1223,1001,1887,1223],'Col_C':[5,14,8,13,16,8]})

# 为每个DataFrame的Device_ID组添加行号
for df in [df_1, df_2, df_3]:
    df['row_num'] = df.groupby('Device_ID').cumcount()

# 基于双键(Device_ID + row_num)进行outer合并
df_final = df_1.merge(df_2, on=['Device_ID', 'row_num'], how='outer')
df_final = df_final.merge(df_3, on=['Device_ID', 'row_num'], how='outer')

# 移除临时的row_num列,得到目标格式
df_final = df_final.drop('row_num', axis=1)

print(df_final)

输出结果(和你的期望完全一致)

Device_ID  Col_A  Col_B  Col_C
0       1001   45.0   35.0    5.0
1       1034   56.0   46.0   14.0
2       1223   78.0   78.0    8.0
3       1001   33.0   33.0   13.0
4       1887    NaN   66.0   16.0
5       1223    NaN    NaN    8.0

为什么这个方法高效?

常规merge只按Device_ID匹配时,每个重复的Device_ID会把所有对应行两两组合(比如Device_ID=1001在df_1有2行,df_2有2行,常规merge会生成4行),导致行数指数级增长。而添加row_num后,每个Device_ID的每一行都有唯一的匹配标识,合并时是严格的一对一映射,不会产生任何多余行,计算效率会提升几十甚至上百倍。

额外优化建议(针对超大数据集)

如果你的DataFrame行数远超71K(比如百万级),可以再结合以下技巧:

  • 提前对每个DataFrame按Device_ID排序,能加快groupby.cumcount()的计算速度
  • 若内存吃紧,可使用dask.dataframe替代pandas,它能自动并行处理大数据集,进一步提升效率

内容的提问来源于stack exchange,提问作者pythondumb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:20:21