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
相关产品推荐
相关产品推荐

