我有一个几十万行的数据框。格式如下:
time_elapsed cycle
0 0.00 1
1 0.50 1
2 1.00 1
3 1.30 1
4 1.50 1
5 0.00 2
6 0.75 2
7 1.50 2
8 3.00 2
我想创建第三列,该列将为我提供该行属于周期的每个时间实例的百分比(直到下一个time_elapsed = 0)。要给出类似的内容:
time_elapsed cycle percentage
0 0.00 1 0
1 0.50 1 33
2 1.00 1 75
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
我不为小数位数感到困惑,这里我只是为了方便起见将它们排除在外。
我开始沿着这条路线走,但我不断出错。
data['percentage'] = data['time_elapsed'].sub(data.groupby(['cycle'])['time_elapsed'].transform(lambda x: x*100/data['time_elapsed'].max()))
我认为这是导致错误的lambda函数,但是我不确定该如何更改。非常感谢您的帮助:)
答案 0 :(得分:3)
使用Series.div
进行除法,而不使用sub
进行减法,然后简化了解决方案-每组仅获取max
,乘以Series.mul
,如有必要,则Series.round
最后用Series.astype
转换为整数:
s = data.groupby(['cycle'])['time_elapsed'].transform('max')
data['percentage'] = data['time_elapsed'].div(s).mul(100).round().astype(int)
print (data)
time_elapsed cycle percentage
0 0.00 1 0
1 0.50 1 33
2 1.00 1 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