【问题标题】:Year to date average in dataframe数据框中的年初至今平均值
【发布时间】:2019-12-17 07:56:57
【问题描述】:

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

    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),以平均从 1 月到同一年中最近一段时间的值(示例数据中的 4 月)。在计算平均值时,我需要按 year & name 对数据进行分组。我正在寻找与此类似的输出。

    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)

非常感谢任何帮助。

【问题讨论】:

    标签: python pandas dataframe pandas-groupby


    【解决方案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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 从未使用过重采样。这会分别计算所有年份的 YTD 平均值吗?我有超过 7 年的数据和 6000 个名字。每个月的每个名称都应该有不同的值。之后我会重置索引以使数据帧恢复到原始格式吗?
      • 'AS' 参数表示年开始频率,因此它不会计算 YTD。您可能想查看此帖子link。是的,您可以在之后重置索引以取回列。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      • 2019-06-07
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多