Python 按给定列分组的累积产品

Python 按给定列分组的累积产品,python,pandas,dataframe,Python,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],

我有以下数据帧:

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 ║
╚══════╩═════╩════════╩══════╝
我需要获得薪资列中每个缺失值的累积乘积,如下所示:

╔══════╦═════╦════════╦══════╗
║ 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循环


谢谢

如果第一份工资始终不为空,您可以
ffill
it。此外,根据您的输出,您似乎需要在相乘之前将总和下移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

哦,天哪。。我是如此接近!!谢谢大家!@Snedecor结果与您的问题中描述的结果不同,因此请交叉检查数学是否正确,谢谢:-)完成!我编辑了我的问题,因为我以前做了一些更改,但忘记编辑代码。@Snedecor仍然存在一些差异,我们中的一个肯定是不正确的;)另外,对于那些感兴趣的人,我添加了一些额外的行,以便获得发布的确切输出。df['Salary']=df.groupby('User')['Rate'].cumprod().mul(df['Salary'].ffill()).shift(),然后是df[~df['Salary'].isna(),'Salary']=df[~df['Salary'].isna(),'Salary']@cs95你能把这个加到你的答案里吗!?非常感谢。