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

Python(Jupyter)中DataFrame列分组求和及最小值提取需求

Pandas DataFrame 连续块分组操作实现方案

需求描述

需在Python(Jupyter)环境下对DataFrame完成两项操作:

  1. 新增Column 3:

    • 对Column 2中大于0的值,按连续非零块分组求和,每组的和赋值给该组所有行;
    • Column 2值为0的行,Column 3对应值设为0。

    原始数据示例:

    Column 1 Column 2
    0       15        0.2
    1       11        0
    2       13        0.4
    3       19        0.4
    4       14        0.4
    5       2         0 
    6       1         0
    7       15        0.4
    8       3         0
    

    处理后结果:

    Column 1 Column 2 Column 3
    0       15        0.2    0.2
    1       11        0      0
    2       13        0.4    1.2
    3       19        0.4    1.2
    4       14        0.4    1.2
    5       2         0      0 
    6       1         0      0
    7       15        0.4    0.4 
    8       3         0      0
    
  2. 新增Column 4:

    • Column 2值为0的行,直接取对应Column 1的值;
    • Column 2值大于0的连续分组行,取该组Column 1的最小值赋值给对应行。

    输入(已生成Column 3):

    Column 1 Column 2 Column 3
    0       15        0.2    0.2
    1       11        0      0
    2       13        0.4    1.2
    3       19        0.4    1.2
    4       14        0.4    1.2
    5       2         0      0 
    6       1         0      0
    7       15        0.4    0.4 
    8       3         0      0
    

    处理后结果:

    Column 1 Column 2 Column 3 Column 4
    0       15        0.2    0.2       15
    1       11        0      0         11
    2       13        0.4    1.2       13 
    3       19        0.4    1.2       13 
    4       14        0.4    1.2       13 
    5       2         0      0         2
    6       1         0      0         1
    7       15        0.4    0.4       15
    8       3         0      0         3
    

优雅实现方案

核心逻辑是通过标记连续非零块生成分组ID,结合Pandas的groupby()和transform()完成批量赋值,全程采用向量化操作,高效简洁。

1. 构造示例DataFrame

import pandas as pd

df = pd.DataFrame({
    'Column 1': [15, 11, 13, 19, 14, 2, 1, 15, 3],
    'Column 2': [0.2, 0, 0.4, 0.4, 0.4, 0, 0, 0.4, 0]
})

2. 生成Column 3

# 生成连续非零块的分组标签:0行标记为NaN,非零块按连续块分配递增整数
group_labels = (df['Column 2'] == 0).cumsum().where(df['Column 2'] > 0)

# 按分组求和,广播到每一行,0行填充为0
df['Column 3'] = df.groupby(group_labels)['Column 2'].transform('sum').fillna(0)

3. 生成Column 4

# 非零块取Column 1的最小值,0行直接保留Column 1的值
df['Column 4'] = df.groupby(group_labels)['Column 1'].transform('min').fillna(df['Column 1'])

最终结果

执行后得到的df与需求示例完全一致:

Column 1  Column 2  Column 3  Column 4
0        15       0.2       0.2      15.0
1        11       0.0       0.0      11.0
2        13       0.4       1.2      13.0
3        19       0.4       1.2      13.0
4        14       0.4       1.2      13.0
5         2       0.0       0.0       2.0
6         1       0.0       0.0       1.0
7        15       0.4       0.4      15.0
8         3       0.0       0.0       3.0

方案优势

  • 无循环遍历,纯Pandas原生向量化操作,性能优异;
  • 分组标签生成逻辑简洁,仅一行代码实现连续块识别;
  • transform()自动完成结果广播,无需手动映射;
  • 代码结构清晰,可读性强,易于维护和扩展。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:20:21