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

Python 3中如何合并Pandas DataFrame中金额和为2045的连续行?

合并Pandas DataFrame中连续金额和为指定值的行

问题场景

你手里有这样的Pandas DataFrame:

import pandas as pd

data = {
    "Date(UTC)": ["2020-10-09 04:00:37", "2020-10-09 03:04:29", "2020-10-09 02:37:43", "2020-10-09 02:37:24", "2020-10-09 01:35:17"],
    "Type": ["SELL"]*5,
    "Amount": [2045.0, 2045.0, 1376.0, 669.0, 2045.0]
}
df = pd.DataFrame(data)

能看到第3、4行的Amount加起来正好等于2045.0,想要把所有连续金额和为2045.0的行合并成一行,最终得到目标格式的DataFrame。

通用简洁解决方案

这里提供一个高效的实现思路,核心是通过累加标记分组,再对分组做聚合:

target_sum = 2045.0

# 计算累加和并对目标值取模,累加达到目标值时会回到0
cum_sum = df['Amount'].cumsum() % target_sum
# 生成分组ID:每次模值回到0时,分组号递增
groups = (cum_sum == 0).cumsum()

# 分组聚合:保留每组第一个时间,Type取同组值,Amount取总和
result = df.groupby(groups).agg({
    'Date(UTC)': 'first',
    'Type': 'first',
    'Amount': 'sum'
}).reset_index(drop=True)

运行后就能得到你想要的结果:

Date(UTC)  Type  Amount
0  2020-10-09 04:00:37  SELL  2045.0
1  2020-10-09 03:04:29  SELL  2045.0
2  2020-10-09 02:37:43  SELL  2045.0
3  2020-10-09 01:35:17  SELL  2045.0

代码逻辑解释

  • cum_sum = df['Amount'].cumsum() % target_sum:计算金额的累加序列,对目标值取模后,只要连续行的累加和等于目标值,模结果就会回到0,以此标记分组节点。
  • groups = (cum_sum == 0).cumsum():把模值为0的位置标记为True,对这些True值累加生成分组ID,这样所有连续加起来等于目标值的行会被归到同一组。
  • groupby(groups).agg(...):对每个分组做聚合,时间可以根据需求选first或last,Type因为同组业务逻辑一致直接取第一个,Amount取分组总和即可。

这个方法是通用的,哪怕是3行、4行连续金额加起来等于目标值,也能自动合并,不需要硬编码行数。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 15:22:35