【问题标题】:Python Pandas Average by Location and Date/MonthPython Pandas 按位置和日期/月份划分的平均值
【发布时间】:2019-02-15 23:23:58
【问题描述】:

使用:Python 3.6、Pandas 0.22

我有一个 .csv 文件,我需要根据月份和位置从中获取平均值。这是数据中的一行,还有更多具有多个位置和日期的:

NAME DATE SNOW GRAND RAPIDS GERALD R FORD INTERNATIONAL AIRPORT, MI US 1/1/2016, 0.7

到目前为止,我已经成功地根据月份和平均每月对信息进行了排序:

df2 = pd.read_csv("Data.csv")

gname = df2.groupby('NAME')

for NAME,  NAME_df2 in gname:
    df2['DATE'] = pd.to_datetime(df2['DATE'])
    df2.groupby(df2['DATE'].dt.strftime('%B'))['SNOW'].mean().sort_values()

执行时:

  DATE
August       0.000000
July         0.000000
June         0.000000
September    0.000000
May          0.000562
October      0.000966
November     0.019712
April        0.155592
March        0.248475
February     0.319048
January      0.622969
December     1.129986
Name: SNOW, dtype: float64

我的问题是,这段代码只是给出了无限循环中所有位置每月的总平均值。我不知道如何让我的输出根据每个位置每月的平均降雪量对数据进行排序。

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

    您在循环中修改 DataFrame 并对其进行迭代。这是错误的。

    您需要按月份和地点进行分组:

    df2.groupby([df.DATE.dt.month,'NAME']).mean()
    

    您将获得一个具有两级多索引的 DataFrame。您可以稍后通过unstack()ing 将其转换为表格。

    【讨论】:

    • 您是否建议我删除.sort_values()?我认为我需要它的原因是因为我从这里开始的下一步是写入一个新的 .csv 文件,其中包含标题 NAME, MONTH, AVERAGE
    • 不,我不是在暗示。答案不取决于你是否删除它。
    【解决方案2】:

    计算df 数字列的平均值,称为df['Sentiment'],每月和'Place' 列中指定的每个地方的平均值:

    0。导入datetime 模块:

        from datetime import datetime
    

    1。数据框

    生成包含'date''Sentiment''Place' 列的 DataFrame:

        date_rng = pd.date_range(start='1/1/2018', end='3/05/2018', freq='W')
        df = pd.DataFrame(date_rng, columns=['date'])
        df['Sentiment']=np.random.randint(0,100,size=(len(date_rng)))
        df['Place']=['home']*3 + ['With friends']*3 + ['School']*3
        print(df)
    
    
    
                date  Sentiment         Place
        0 2018-01-07         62          home
        1 2018-01-14         55          home
        2 2018-01-21         84          home
        3 2018-01-28         65  With_friends
        4 2018-02-04          3  With_friends
        5 2018-02-11         26  With_friends
        6 2018-02-18          9        School
        7 2018-02-25         52        School
        8 2018-03-04         74        School
    

    2。将'date'列转换为df的索引:然后从索引中检索列表:

        df.set_index('date',inplace=True)
        months=df.index.month
    
    
    
                    Sentiment         Place
        date                               
        2018-01-07         64          home
        2018-01-14         41          home
        2018-01-21         97          home
        2018-01-28         44  With_friends
        2018-02-04         37  With_friends
        2018-02-11         69  With_friends
        2018-02-18         15        School
        2018-02-25         42        School
        2018-03-04          4        School
    

    3。按组计算平均值:月和'Place'

        monthly_val=df.groupby([months,'Place']).mean()
    
    
    
                           Sentiment
        date Place                  
        1    With_friends  44.000000
             home          67.333333
        2    School        28.500000
             With_friends  53.000000
        3    School         4.000000
    

    4。 unstack()

    正如上面 @DYZ 建议的那样,您可以取消堆叠monthly_val 以获得信息丰富的交叉表:

        monthly_val.unstack()
    
    
    
              Sentiment                   
        Place    School With_friends  home
        date                              
        1           NaN         65.0  67.0
        2          30.5         14.5   NaN
        3          74.0          NaN   NaN
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-07
      • 1970-01-01
      • 2015-07-31
      • 2021-02-12
      相关资源
      最近更新 更多