Python(Jupyter)中DataFrame列分组求和及最小值提取需求
Pandas DataFrame 连续块分组操作实现方案
需求描述
需在Python(Jupyter)环境下对DataFrame完成两项操作:
新增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新增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
相关产品推荐
相关产品推荐

