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你能把这个加到你的答案里吗!?非常感谢。