首页 > 解决方案 > 获取熊猫数据框中特定列的累积总和和平均值

问题描述

我有一个数据框:

# create example df
df = pd.DataFrame(index=[1,2,3,4,5,6])
df['ID'] = [1,1,1,2,2,2]
df['election_date'] = pd.date_range("01/01/2010", periods=6, freq="M")
df['stock_price'] = [1,2,3,4,5,6]

# sort values
df.sort_values(['election_date'], inplace=True, ascending=False)
df

    ID  election_date   stock_price
6   2   2010-06-30       6
5   2   2010-05-31       5
4   2   2010-04-30       4
3   1   2010-03-31       3
2   1   2010-02-28       2
1   1   2010-01-31       1

我的目标是计算stock_price每个列的累积总和和平均值ID。我成功计算了累积总和:

df['stock_price_sum_past'] = (df.iloc[::-1]
               .groupby('ID')['stock_price']
               .apply(lambda x: x.shift().cumsum())
               .fillna(0)
               .astype(int))


    ID  election_date   stock_price stock_price_sum_past
6   2    2010-06-30          6             9
5   2    2010-05-31          5             4
4   2    2010-04-30          4             0
3   1    2010-03-31          3             3
2   1    2010-02-28          2             1
1   1    2010-01-31          1             0

我没有成功计算列的累积平均值stock_price。此外,我不明白如何获取该列的累积计数election_date。我知道有cumcount 之类的东西,但我不明白如何将它应用于我的问题。

编辑:

我相信这是预期的意思:

ID  election_date   stock_price stock_price_sum_past    stock_price_mean_past
6   2   2010-06-30       6            9                        4.5
5   2   2010-05-31       5            4                        4.0
4   2   2010-04-30       4            0                        NaN
3   1   2010-03-31       3            3                        1.5
2   1   2010-02-28       2            1                        1.0
1   1   2010-01-31       1            0                        NaN

我想你可以用 0 替换 NaN。取决于你的定义mean

标签: pandasdataframecountsumaggregate

解决方案


我们可以使用and创建sort数据帧election_date并创建一个顺序计数器,然后将其除以累积和 per以获得累积平均值groupbycumcountcounterID

df = df.sort_values('election_date')
grp =  df.groupby('ID')['stock_price']
df['cum_sum'] = grp.apply(lambda p: p.shift(fill_value=0).cumsum())
df['cum_mean'] = df['cum_sum'] / grp.cumcount()

   ID election_date  stock_price  cum_sum  cum_mean
1   1    2010-01-31            1        0       NaN
2   1    2010-02-28            2        1       1.0
3   1    2010-03-31            3        3       1.5
4   2    2010-04-30            4        0       NaN
5   2    2010-05-31            5        4       4.0
6   2    2010-06-30            6        9       4.5

PS:生成的数据帧按date升序排序。


推荐阅读