如何高效实现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
相关产品推荐
相关产品推荐

