基于C2列连续相同值的DataFrame中C1列均值计算需求
问题描述
我有如下结构的DataFrame:
| C1 | C2 |
|---|---|
| 10 | 10 |
| 20 | 10 |
| 30 | 16 |
| 5 | 23 |
| 6 | 23 |
| 8 | 10 |
| 4 | 10 |
| 2 | 10 |
需要根据C2列的连续相同值区块计算对应C1列的均值(即C2值发生变更前,所有同区块C1值的均值),期望得到的结果如下:
| C1 | C2 |
|---|---|
| 15 | 10 |
| 30 | 16 |
| 5.5 | 23 |
| 4.67 | 10 |
解决方案
可以借助Pandas的分组功能,先标记出C2列的连续相同值区块,再按区块计算C1的均值:
import pandas as pd # 构造原始DataFrame df = pd.DataFrame({ 'C1': [10, 20, 30, 5, 6, 8, 4, 2], 'C2': [10, 10, 16, 23, 23, 10, 10, 10] }) # 生成连续分组标识:C2值变化时分组编号递增 group_id = df['C2'].ne(df['C2'].shift()).cumsum() # 按分组计算均值,保留C2对应值并格式化结果 result = df.groupby(group_id).agg( C1=('C1', lambda x: round(x.mean(), 2)), C2=('C2', 'first') ).reset_index(drop=True) print(result)
运行代码后输出结果:
C1 C2 0 15.00 10 1 30.00 16 2 5.50 23 3 4.67 10
代码说明
df['C2'].ne(df['C2'].shift()):对比当前行与上一行的C2值,返回布尔值序列标记值的变化点.cumsum():将布尔值累加生成连续分组的唯一编号groupby(group_id).agg(...):按分组计算C1的均值(保留两位小数),同时取每组第一个C2值作为结果列的对应值
内容的提问来源于stack exchange,提问作者Horst-Jackson
相关产品推荐
相关产品推荐

