数据框中的年初至今平均值

时间:2019-12-17 07:56:57

标签: python pandas dataframe pandas-groupby

我有一个数据框,我正在尝试计算我的值列的年初至今平均值。下面是一个示例数据框。

    date       name values  values2
0   2019-01-01  a     1        1
1   2019-02-01  a     3        3
2   2019-03-01  a     2        2
3   2019-04-01  a     6        2

我想创建新列( values_ytd和values2_ytd ),以对从一月到同一年内最新期间(样本数据中的四月)的值进行平均。在计算平均值时,我需要按年份和名称对数据进行分组。我正在寻找与此类似的输出。

    date        name    values  values2  values2_ytd    values_ytd
0   2019-01-01   a        1        1         1              1
1   2019-02-01   a        3        3         2              2
2   2019-03-01   a        2        2         2              2
3   2019-04-01   a        6        2         2              3

我尝试使用expanding().mean()失败,但是很可能我做错了。我的主要数据框具有许多名称类别和更多列。这是我尝试使用的代码

df1.groupby([df1['name'], df1['date'].dt.year], as_index=False).expanding().mean().loc[:, 'values':'values2'].add_suffix('_ytd').reset_index(drop=True,level=0)

但收到以下错误。

NotImplementedError: ops for Expanding for this dtype datetime64[ns] are not implemented

注意:下面的代码在用cumsum()代替.expanding().mean()来创建值的年初至今总和时非常有效,但是我无法求出平均值

df1.groupby([df1['name'], df1['date'].dt.year], as_index=False).cumsum().loc[:, 'values':'values2'].add_suffix('_ytd').reset_index(drop=True,level=0)

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您应将date列设置为索引:df.set_index('date', inplace=True),然后使用df.resample('AS').groupby('name').mean()

答案 1 :(得分:1)

尝试一下:

df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
df[['values2_ytd', 'values_ytd']] = df.groupby([df.index.year, 'name'])['values','values2'].expanding().mean().reset_index(level=[0,1], drop=True)


df
           name  values  values2  values2_ytd  values_ytd
date                                                     
2019-01-01    a       1        1          1.0         1.0
2019-02-01    a       3        3          2.0         2.0
2019-03-01    a       2        2          2.0         2.0
2019-04-01    a       6        2          3.0         2.0

使用多个名称和年份的示例:

    date       name values  values2
0   2019-01-01  a     1        1
1   2019-02-01  a     3        3
2   2019-03-01  a     2        2
3   2019-04-01  a     6        2
4   2019-01-01  b     1        4
5   2019-02-01  b     3        4
6   2020-01-01  a     1        1
7   2020-02-01  a     3        3
8   2020-03-01  a     2        2
9   2020-04-01  a     6        2

输出:

           name  values  values2  values2_ytd  values_ytd
date                                                     
2019-01-01    a       1        1          1.0         1.0
2019-02-01    a       3        3          2.0         2.0
2019-03-01    a       2        2          2.0         2.0
2019-04-01    a       6        2          3.0         2.0
2019-01-01    b       1        4          1.0         4.0
2019-02-01    b       3        4          2.0         4.0
2020-01-01    a       1        1          1.0         1.0
2020-02-01    a       3        3          2.0         2.0
2020-03-01    a       2        2          2.0         2.0
2020-04-01    a       6        2          3.0         2.0