如何以Pythonic方式在Pandas中对连续整数分组并求和?
优雅解决连续差值分组求和的Pythonic方案
这个需求其实用pandas的矢量化操作就能轻松搞定,完全不用复杂的掩码移位逻辑,代码简洁还高效。咱们一步步来:
首先先还原你的示例DataFrame:
import pandas as pd df = pd.DataFrame({ 'some_int': [1, 2, 10, 11, 15], 'another_int': [5, 6, 7, 8, 9] })
核心思路
我们的目标是把some_int中连续差值为1的元素归为一组,关键在于识别新分组的起点:当某个元素和前一个元素的差值不等于1时,它就是新分组的第一个元素。利用这个逻辑,我们可以生成分组标签,再用groupby求和。
实现代码
# 生成分组ID:相邻元素差值≠1时标记为新分组,累加得到连续分组号 df['group_id'] = (df['some_int'].diff() != 1).cumsum() - 1 # 减1让分组从0开始 # 按分组ID对another_int求和 sum_result = df.groupby('group_id')['another_int'].sum() print(sum_result)
运行后输出完全符合你的预期:
group_id 0 11 1 15 2 9 Name: another_int, dtype: int64
代码解释
df['some_int'].diff():计算每一行与前一行的差值,第一行因为没有前一行,结果是NaN。(df['some_int'].diff() != 1):把差值不等于1的位置标记为True(包括第一行的NaN,因为NaN != 1会返回True),这些位置就是新分组的起点。.cumsum():对布尔序列累加,True会被当作1,False当作0,这样就能生成连续的分组编号。减1是为了让分组从0开始,和你预期的分组序号一致。- 最后用
groupby按分组ID求和,一步到位。
这种方法完全利用pandas的内置矢量化操作,没有冗余逻辑,既符合Pythonic的简洁风格,又能保证运行效率,比手动处理掩码要优雅得多~
内容的提问来源于stack exchange,提问作者Luis Enrique Pastrana
相关产品推荐
相关产品推荐

