首页 > 解决方案 > Rolling.sum() 与所有以前的事件?

问题描述

我一直在查看 .rolling 文档,似乎您需要提供一个窗口,但我想做的只是将某个列的所有先前出现的事件按 .rolling 的顺序求和occurs

import pandas as pd
import numpy as np

df = pd.DataFrame({'person':['john','mike','john','mike','john','mike','john','mike','john','mike'],
                   'star':[1,1,1,1,1,1,1,1,1,1],
                   'occurs':[1001,1001,1002,1002,1003,1003,1004,1004,1005,1005],
                    })

在此处输入图像描述

这是我尝试过的,这不是正确的解决方案。

df['b'] = df.groupby('person')['star'].transform(lambda x: x.rolling(2).sum().shift())

期望的结果:

df_result = pd.DataFrame({'person':['john','mike','john','mike','john','mike','john','mike','john','mike'],
                          'star':[1,1,1,1,1,1,1,1,1,1],
                          'occurs':[1001,1001,1002,1002,1003,1003,1004,1004,1005,1005],
                          'b':[None,None,1,1,2,2,3,3,4,4],
                          })

在此处输入图像描述

标签: pythonpandasdataframe

解决方案


你快到了。而不是rolling你可以使用的窗口cumsum()

import pandas as pd
import numpy as np

df = pd.DataFrame({'person':['john','mike','john','mike','john','mike','john','mike','john','mike'],
                   'star':[1,1,1,1,1,1,1,1,1,1],
                   'occurs':[1001,1001,1002,1002,1003,1003,1004,1004,1005,1005],
                    })

df['b'] = df.groupby('person')['star'].cumsum() - 1
df.loc[df['b'] == 0, 'b'] = np.nan
df

和只是为了获得您想要-1df.loc[df['b'] == 0, 'b'] = np.nan完全相同的结果。


推荐阅读