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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:40:35