【问题标题】:pandas groupby with function as key以功能为键的熊猫 groupby
【发布时间】:2020-10-27 03:18:13
【问题描述】:

我想计算时间跨度为 3 年的平均值。 我的数据是这样的:

import pandas as pd 
import numpy as np

N=120
data = {'p1': np.random.randint(50,100,N),
        'p2': np.random.randint(0,100,N),
        'p3': np.random.randint(10,70,N)
        }
df = (pd.DataFrame(data, index=pd.bdate_range(start='20100101', periods=N, freq='BM'))
      .stack()
      .reset_index()
      .rename(columns={'level_0': 'date', 'level_1': 'type', 0: 'price'})
      .sort_values('date')
      )

我试过了:

(df.sort_values('date')
       .groupby(['type', 
                 ''.join([(df.date.dt.year-3), '-', (df.date.dt.year)]) #3 years time span
                ]
               )
       ['price']
       .apply(lambda x: x.mean())
       )

但收到一条错误消息:

TypeError: sequence item 0: expected str instance, Series found

我想按 2010-2013、2011-2014、2012-2015 的类型/时间段计算价格的平均值(和其他统计数据)...

标签很重要,因为我可以使用:

(df.sort_values('date')
       .groupby(['type', df.date.dt.year//3]) #3 years time span
       ['price']
       .apply(lambda x: x.mean())
)

有什么想法吗?

【问题讨论】:

  • 你的预期输出是什么?

标签: pandas dataframe group-by


【解决方案1】:

我想我找到了自己问题的答案(其他人可能会感兴趣):

(df.sort_values('date')
       .groupby(['type', (df.date.dt.year-3).astype(str).str.cat((df.date.dt.year).astype(str), sep='-')
                ]
               )
       ['price']
       .apply(lambda x: x.mean())
)

【讨论】:

    猜你喜欢
    • 2013-02-28
    • 2018-08-12
    • 2018-12-07
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    相关资源
    最近更新 更多