按给定列分组的累积产品

我有以下 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 循环?


一只名叫tom的猫
浏览 83回答 1
1回答

慕桂英546537

如果第一个 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.001    22.002    24.203    15.004    19.505    25.006    28.757    28.75dtype: float64
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python