如何不使用for loop按类别连续更新DataFrame的Constant列?
问题描述
我有一个如下所示的DataFrame:
| Category | Number | Constant |
|---|---|---|
| One | 141.2 | 271.01 |
| One | 57.4 | 271.01 |
| One | 51.3 | 271.01 |
| Two | 24.69 | 27.29 |
| Two | 12.72 | 27.29 |
| Two | 10.37 | 27.29 |
我需要按Category分组,对每组的Constant列进行迭代更新:每组第一个值为初始Constant减去对应Number,后续每个值为前一行更新后的Constant减去当前行的Number,最终得到如下结果:
| Category | Number | Constant |
|---|---|---|
| One | 141.2 | 129.99 |
| One | 57.4 | 72.59 |
| One | 51.3 | 21.29 |
| Two | 24.69 | 2.6 |
| Two | 12.72 | -10.12 |
| Two | 10.37 | -20.49 |
请问是否可以不使用for loop实现该需求?
解决方案
完全可以不用for loop实现,利用Pandas的分组和累计求和功能就能高效完成:
核心思路:对于每个分组,更新后的Constant等于分组初始Constant值减去当前行及之前所有Number的累计和。
具体代码实现如下:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'Category': ['One', 'One', 'One', 'Two', 'Two', 'Two'], 'Number': [141.2, 57.4, 51.3, 24.69, 12.72, 10.37], 'Constant': [271.01, 271.01, 271.01, 27.29, 27.29, 27.29] }) # 按Category分组计算并更新Constant列 df['Constant'] = df.groupby('Category').apply( lambda x: x['Constant'].iloc[0] - x['Number'].cumsum() ).reset_index(level=0, drop=True) print(df)
代码说明
groupby('Category'):按类别拆分数据,单独处理每组内容x['Constant'].iloc[0]:提取每组的初始Constant值(每组所有行初始值一致,取第一行即可)x['Number'].cumsum():计算每组内Number列的累计求和,等价于逐行累加前面所有Number的值- 用初始Constant减去累计和,直接得到迭代更新后的结果,最后通过
reset_index去除分组索引,合并回原DataFrame
这种方法依托Pandas的向量化操作,比for loop效率更高,尤其适合处理大规模数据集,运行结果与预期完全一致。
内容的提问来源于stack exchange,提问作者peho15ae
相关产品推荐
相关产品推荐

