求助:为DataFrame按Cycle分组生成归一化百分比列
按分组计算DataFrame中时间列的百分比占比
首先,咱们来分析你之前代码的问题:
- 你在lambda函数里用了
data['time_elapsed'].max(),这是整个DataFrame的全局最大值,不是当前cycle分组内的最大值,这会导致计算逻辑完全错误; - 另外,
sub()是减法操作,而你需要的是除法来计算占比,这也是一个逻辑失误。
下面是修正后的代码,完全符合你的需求:
import pandas as pd # 你的示例数据 data = pd.DataFrame({ 'time_elapsed': [0.00, 0.50, 1.00, 1.30, 1.50, 0.00, 0.75, 1.50, 3.00], 'cycle': [1, 1, 1, 1, 1, 2, 2, 2, 2] }) # 核心逻辑:按cycle分组取最大值,计算占比后转百分比 data['percentage'] = (data['time_elapsed'] / data.groupby('cycle')['time_elapsed'].transform('max')) * 100 # 可选:如果需要像示例那样取整(去掉小数) data['percentage'] = data['percentage'].round(0).astype(int) print(data)
代码解释:
data.groupby('cycle')['time_elapsed'].transform('max'):这个操作会为每一行匹配到它所属cycle分组的最大time_elapsed值,确保每个分组用自己的基准值计算占比;- 用当前行的
time_elapsed除以分组最大值,再乘以100得到百分比; - 最后用
round(0).astype(int)把结果转成整数,和你期望的输出格式完全一致。
运行后你会得到正确结果:
time_elapsed cycle percentage 0 0.00 1 0 1 0.50 1 33 2 1.00 1 67 # 注:你示例里写的75是笔误,1.00/1.50*100≈67 3 1.30 1 87 4 1.50 1 100 5 0.00 2 0 6 0.75 2 25 7 1.50 2 50 8 3.00 2 100
内容的提问来源于stack exchange,提问作者ShrutiTurner
相关产品推荐
相关产品推荐

