如何基于起拍价用累计最大值修正DataFrame中物品价值列数据
解决方法
要搞定这个问题,核心是对每个ItemType+ItemOrigin的分组,按起拍价升序排序后计算累计最大值,用这个值修正不符合规则的物品价值。用Pandas的groupby配合cummax()就能实现,具体步骤如下:
代码实现
import pandas as pd # 假设你的数据存储在df中 def process_group(group): # 按起拍价升序排列,确保从低到高处理 sorted_group = group.sort_values('Starting Bid') # 用累计最大值替换原价值列,保证高起拍价的价值不低于之前所有低起拍价的物品 sorted_group['Value of item'] = sorted_group['Value of item'].cummax() return sorted_group # 分组处理,保持原数据结构 df_cleaned = df.groupby(['ItemType', 'ItemOrigin'], group_keys=False).apply(process_group) # 恢复原DataFrame的行顺序(如果需要保留原始行排列) df_cleaned = df_cleaned.loc[df.index]
关键细节
groupby(..., group_keys=False):避免分组键混入结果索引,保持原DataFrame的列结构不变。cummax():这是核心逻辑——它会逐行计算从第一行到当前行的最大值,自动确保同组内起拍价越高,物品价值不会低于任何更低起拍价的物品,完美匹配你设定的规则。- 最后用
loc[df.index]还原原始行顺序,防止分组排序后打乱数据的原有排列逻辑。
效果验证
比如原始数据中有不符合规则的行:
| ItemType | ItemOrigin | Starting Bid | Value of item |
|---|---|---|---|
| 电子设备 | 中国 | 500 | 700 |
| 电子设备 | 中国 | 800 | 750 |
| 电子设备 | 中国 | 1000 | 720 |
处理后结果:
| ItemType | ItemOrigin | Starting Bid | Value of item |
|---|---|---|---|
| 电子设备 | 中国 | 500 | 700 |
| 电子设备 | 中国 | 800 | 750 |
| 电子设备 | 中国 | 1000 | 750 |
这样就完成了事后的数据清洗,完全满足你的需求。
内容的提问来源于stack exchange,提问作者codenoodles
相关产品推荐
相关产品推荐

