Pandas合并DataFrame后去重求和:高效处理轴点流量数据
高效合并并聚合下水道轴点流量数据
我有两个分别记录下水道终点(HAL_NACHSC)和起点(HAL_VONSCH)轴点流量(Q)的DataFrame,当前通过outer merge合并后出现了重复条目(比如同一个轴点对应多条Q值,导致合并后Q_y重复出现),需要为每个轴点ID计算Q值的总和,且避免重复累加,同时要求方案执行效率极高(需多次运行)。
原始代码与合并问题
import pandas as pd d1 = {'HAL_NACHSC': ['03539001', '03531028', '03530018', '03530018', '03539001', '03530017', '03531028', '03530016', '03531031', '03531030', '03537002', '03537001', '03531029'], 'Q': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]} df1 = pd.DataFrame(d1) d2 = {'HAL_VONSCH': ['03539003', '03537001', '03530019', '03539001', '03539002', '03530018', '03531029', '03530017', '03531032', '03531031', '03530016', '03537002', '03531030'], 'Q': [0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12]} df2 = pd.DataFrame(d2) # 当前合并方式会产生重复条目 SigmaQ = df1.merge(df2, left_on='HAL_NACHSC', right_on='HAL_VONSCH', how='outer')
合并后得到的SigmaQ存在重复累加问题(如同一轴点的Q_y被多次重复显示):
HAL_NACHSC Q_x HAL_VONSCH Q_y 0 03539001 0.0 03539001 -3.0 1 03539001 4.0 03539001 -3.0 2 03531028 1.0 NaN NaN 3 03531028 6.0 NaN NaN 4 03530018 2.0 03530018 -5.0 5 03530018 3.0 03530018 -5.0 ...
高效解决方案:先聚合,再合并
核心思路是先对两个DataFrame分别去重聚合,再执行合并,避免产生笛卡尔积式的重复数据,大幅提升运行效率。
步骤1:分别按轴点ID聚合求和
先对两个原始DataFrame按轴点ID分组,计算每个ID对应的Q值总和,直接去掉重复条目:
# 聚合df1:每个HAL_NACHSC对应的Q总和 df1_agg = df1.groupby('HAL_NACHSC', as_index=False)['Q'].sum().rename(columns={'Q': 'Q_x_sum'}) # 聚合df2:每个HAL_VONSCH对应的Q总和 df2_agg = df2.groupby('HAL_VONSCH', as_index=False)['Q'].sum().rename(columns={'Q': 'Q_y_sum'})
步骤2:聚合结果执行outer merge
用聚合后的DataFrame做outer merge,直接得到无重复的合并结果:
SigmaQ_final = df1_agg.merge(df2_agg, left_on='HAL_NACHSC', right_on='HAL_VONSCH', how='outer')
步骤3:计算每行总流量(可选)
如果需要每行的总流量,直接按行求和:
SigmaQ_final['Total_Q'] = SigmaQ_final[['Q_x_sum', 'Q_y_sum']].sum(axis=1, numeric_only=True)
最终结果
运行后得到的SigmaQ_final与预期完全一致:
HAL_NACHSC Q_x_sum HAL_VONSCH Q_y_sum Total_Q 0 03539001 4.0 03539001 -3.0 1.0 1 03531028 7.0 NaN NaN 7.0 2 03530018 5.0 03530018 -5.0 0.0 3 03530017 5.0 03530017 -7.0 -2.0 4 03530016 7.0 03530016 -10.0 -3.0 5 03531031 8.0 03531031 -9.0 -1.0 6 03531030 9.0 03531030 -12.0 -3.0 7 03537002 10.0 03537002 -11.0 -1.0 8 03537001 11.0 03537001 -1.0 10.0 9 03531029 12.0 03531029 -6.0 6.0 10 NaN NaN 03539003 0.0 0.0 11 NaN NaN 03530019 -2.0 -2.0 12 NaN NaN 03539002 -4.0 -4.0 13 NaN NaN 03531032 -8.0 -8.0
效率说明
- 原方案先合并再处理重复:合并会产生笛卡尔积(比如一个轴点在df1中有2条、df2中有1条,合并后会产生2条重复的Q_y),后续去重/聚合需要处理更多数据,时间复杂度更高。
- 先聚合再合并:
groupby.sum()是Pandas高度优化的操作,时间复杂度为O(n),合并时处理的是去重后的轴点数据,数据量远小于原合并结果,整体效率提升显著,适合多次运行的场景。
内容的提问来源于stack exchange,提问作者jerremaier
相关产品推荐
相关产品推荐

