获取熊猫DataFrame的复杂平均值

时间:2019-02-15 12:27:32

标签: python pandas

我有一个包含2列的简单DataFrame-日期和值。我需要创建另一个DataFrame,其中包含每年每个月的平均值。例如,我的每日数据范围为2015年1月1日至2018年12月31日 我需要2015年,2016年等每个月的平均值。 哪种方法最简单?

2 个答案:

答案 0 :(得分:2)

您可以使用Series.dt.to_periodmean按月汇总:

df['date'] = pd.to_datetime(df['date'])
df1 = df.groupby(df['date'].dt.to_period('m'))['col'].mean().reset_index()

另一种在年份和月份分别位于列中的解决方案:

df['date'] = pd.to_datetime(df['date'])
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df1 = df.groupby(['year','month'])['col'].mean().reset_index()

示例

df = pd.DataFrame({'date':['2015-01-02','2016-03-02','2015-01-23','2016-01-12','2015-03-02'],
                   'col':[1,2,5,4,6]})
print (df)
         date  col
0  2015-01-02    1
1  2016-03-02    2
2  2015-01-23    5
3  2016-01-12    4
4  2015-03-02    6

df['date'] = pd.to_datetime(df['date'])
df1 = df.groupby(df['date'].dt.to_period('m'))['col'].mean().reset_index()
print (df1)
      date  col
0  2015-01    3
1  2015-03    6
2  2016-01    4
3  2016-03    2

df['date'] = pd.to_datetime(df['date'])
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df2 = df.groupby(['year','month'])['col'].mean().reset_index()
print (df2)
   year  month  col
0  2015      1    3
1  2015      3    6
2  2016      1    4
3  2016      3    2

答案 1 :(得分:0)

要获取当DataFrame具有每日数据行时该数据框架的每月平均值,我将:

  1. 将日期为df['dates']的列转换为DataFrame df的索引:df.set_index('date',inplace=True)
  2. 然后我将索引dates转换为月索引:df.index.month
  3. 最后,我将计算数据框的均值按月份分组df.groupby(df.index.month).data.mean()

我慢慢地把每一步扔到这里:

具有日期和值的Generation DataFrame

  • 您需要首先导入Pandas和Numpy以及模块datetime

    from datetime import datetime
    
  • 在2019年1月1日至2019年5月3日之间以“ W”周的间隔生成一列'date'。还有一列'data',其随机值介于1到100之间:

    date_rng = pd.date_range(start='1/1/2018', end='3/05/2018', freq='W')
    df = pd.DataFrame(date_rng, columns=['date'])
    df['data']=np.random.randint(0,100,size=(len(date_rng)))
    
  • df有两列'date''data'

            date  data
    0 2018-01-07    42
    1 2018-01-14    54
    2 2018-01-21    30
    3 2018-01-28    43
    4 2018-02-04    65
    5 2018-02-11    40
    6 2018-02-18     3
    7 2018-02-25    55
    8 2018-03-04    81
    

'date'列设置为DataFrame的索引:

    df.set_index('date',inplace=True)
  • df有一列'data',索引是'date'

                data
    date            
    2018-01-07    42
    2018-01-14    54
    2018-01-21    30
    2018-01-28    43
    2018-02-04    65
    2018-02-11    40
    2018-02-18     3
    2018-02-25    55
    2018-03-04    81
    

从索引中获取月份号

    months=df.index.month

获得按月分组的每个月的平均值:

    monthly_avg=df.groupby(months).data.mean()

按月份'monthly_avg'划分的数据集的平均值为:

    date
    1    42.25
    2    40.75
    3    81.00
    Name: data, dtype: float64