我有以下 Pandas DataFrame:df = pd.DataFrame([[1, 21, 20, 1.10], [1, 22, float('NaN'), 1.10], [1, 23, float('NaN'), 1.12], [2, 21, 15, 1.30], [2, 22, float('NaN'), 1.12], [3, 21, 25, 1.15], [3, 22, float('NaN'), 1.00], [3, 23, float('NaN'), 1.13]], columns=['User', 'Age', 'Salary', 'Rate'])╔══════╦═════╦════════╦══════╗║ User ║ Age ║ Salary ║ Rate ║╠══════╬═════╬════════╬══════╣║ 1 ║ 21 ║ 20 ║ 1.10 ║║ 1 ║ 22 ║ NaN ║ 1.10 ║║ 1 ║ 23 ║ NaN ║ 1.12 ║║ 2 ║ 21 ║ 15 ║ 1.30 ║║ 2 ║ 22 ║ NaN ║ 1.12 ║║ 3 ║ 21 ║ 25 ║ 1.15 ║║ 3 ║ 22 ║ NaN ║ 1.00 ║║ 3 ║ 23 ║ NaN ║ 1.13 ║╚══════╩═════╩════════╩══════╝我需要获取 Salary 列中每个缺失值的累积乘积,如下所示:╔══════╦═════╦════════╦══════╗║ User ║ Age ║ Salary ║ Rate ║╠══════╬═════╬════════╬══════╣║ 1 ║ 21 ║ 20 ║ 1.10 ║║ 1 ║ 22 ║ 22 ║ 1.10 ║║ 1 ║ 23 ║ 24.2 ║ 1.12 ║║ 2 ║ 21 ║ 15 ║ 1.30 ║║ 2 ║ 22 ║ 19.5 ║ 1.12 ║║ 3 ║ 21 ║ 25 ║ 1.15 ║║ 3 ║ 22 ║ 28.75 ║ 1.00 ║║ 3 ║ 23 ║ 28.75 ║ 1.13 ║╚══════╩═════╩════════╩══════╝我尝试了几个选项,例如:df.groupby('User')['Rate'].cumprod().mul('Salary')但这些都不起作用。有没有办法避免 for 循环?
1 回答
慕桂英546537
TA贡献1848条经验 获得超10个赞
如果第一个 Salary 总是 Non-null,你可以ffill。此外,根据您的输出,您似乎需要在相乘之前将 cumsum 向下移动 1 行。
(df.groupby('User')['Rate']
.apply(lambda x: x.cumprod().shift())
.mul(df['Salary'].ffill())
.fillna(df['Salary']))
0 20.00
1 22.00
2 24.20
3 15.00
4 19.50
5 25.00
6 28.75
7 28.75
dtype: float64
添加回答
举报
0/150
提交
取消