我有一个数据框:
# 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
答案 0 :(得分:3)
我们可以sort
election_date
上的数据帧并使用groupby
和cumcount
创建一个连续计数器,然后将此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
升序排序。