获取熊猫数据框中特定列的累积总和和平均值

时间:2021-05-05 08:01:21

标签: pandas dataframe count sum aggregate

我有一个数据框:

# 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_priceID 的累积总和和平均值。我成功计算了累积总和:

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

的定义

1 个答案:

答案 0 :(得分:3)

我们可以sort election_date 上的数据帧并使用groupbycumcount 创建一个连续计数器,然后将此counter 除以每个{ {1}} 获得累积平均值

ID

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()

P.S:结果数据框按 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 升序排序。