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

如何高效实现Pandas中连续行col3值小于3时的行向求和?

高效解决Pandas中连续行分组求和问题

嘿,我明白你现在用for循环处理这个问题效率拉胯的痛苦,Pandas的强项就是向量化操作和分组处理,咱们完全可以抛弃循环,用更高效的方法搞定这个需求。

先把你的原始数据和需求明确下:

你的原始DataFrame是这样的:

import pandas as pd

data = {
    'col1': ['A', 'B', 'A', 'C', 'B', 'C'],
    'col2': [34, 86, 53, 24, 21, 11],
    'col3': [1, 2, 21, 33, 2, 1]
}
df = pd.DataFrame(data)

需求是:把连续的、col3值小于3的行合并成一行,col2取这些行的和,col1取该连续块的第一个值;而col3≥3的行则直接保留原样,最终得到你想要的目标DataFrame。


步骤1:创建连续块的分组标识

我们需要把连续的col3<3的行归为同一个组,col3≥3的每行单独成组。可以用cumsum()来生成分组键:

# 当col3>=3时,生成一个新的分组标识,累加后每个连续块都有唯一ID
df['block'] = (df['col3'] >= 3).cumsum()

这样处理后,每个连续的col3<3的行都会被分到同一个block里,而col3≥3的行各自属于单独的block。

步骤2:按分组处理数据

接下来我们对每个block应用自定义处理函数:如果组内所有行的col3都小于3,就合并成一行(col1取第一个,col2求和);否则直接保留原行的col1和col2。

def process_block(group):
    # 判断当前组是否全是col3<3的行
    if (group['col3'] < 3).all():
        # 合并成一行:col1取第一个元素,col2求和
        return pd.DataFrame({
            'col1': [group['col1'].iloc[0]],
            'col2': [group['col2'].sum()]
        })
    else:
        # 非连续小值行,直接保留原数据的col1和col2
        return group[['col1', 'col2']]

# 应用函数并合并所有结果
result = df.groupby('block').apply(process_block).reset_index(drop=True)

最终结果

运行完上面的代码,result就是你想要的目标DataFrame:

col1  col2
0    A   120
1    A    53
2    C    24
3    B    32

这个方法完全利用了Pandas的分组优化,比for循环快得多,尤其是当你的数据量很大的时候,效率提升会非常明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 09:33:13