根据数据框列的各部分添加归一化值列

时间:2019-07-09 12:21:57

标签: python python-3.x pandas

我有一个几十万行的数据框。格式如下:

   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函数,但是我不确定该如何更改。非常感谢您的帮助:)

1 个答案:

答案 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