【问题标题】:Getting complicated average values for pandas DataFrame获取 pandas DataFrame 的复杂平均值
【发布时间】:2019-02-15 22:19:11
【问题描述】:

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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以使用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
    

    【讨论】:

    • 获取AttributeError: Can only use .dt accessor with datetimelike values
    • 这意味着没有日期时间,检查编辑的答案。
    • 谢谢,现在检查。它们是常规的日期时间值......不是<class 'pandas._libs.tslibs.timestamps.Timestamp'>
    • @user3751086 - 是的,这取决于数据,有时 pandas 可以将日期时间转换为Timestamps,有时不是,所以有必要to_datetime。 :)
    【解决方案2】:

    要在 DataFrame 具有每日数据行时获取 Data Frame 的月平均值,我会:

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

    我去慢慢把每一步都扔到这里:

    带有日期和值的生成 DataFrame

    • 你需要先导入 Pandas 和 Numpy,以及模块datetime

      from datetime import datetime
      
    • 在 2019 年 1 月 1 日到 2019 年 3 月 5 日之间以“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'column为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
    

    【讨论】:

      猜你喜欢
      • 2014-09-23
      • 2018-07-11
      • 2020-11-14
      • 2021-05-05
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      • 2019-02-01
      • 2018-11-21
      相关资源
      最近更新 更多