【问题标题】:Count occurences for each day in pandas dataframe计算熊猫数据框中每天的出现次数
【发布时间】:2019-05-13 09:31:42
【问题描述】:

我有一个数据框,其中包含 2008 年至 2018 年每天的历史天气数据。像这样:

   Date        precipMM    Rain_Type
0 2008-07-01    0.0        No rain
1 2008-07-02    0.0        No rain
2 2008-07-03    0.0        No rain
3 2008-07-04    0.3        Light Rain
4 2008-07-05    1.1        Light Rain
...
5 2018-07-06    0.3        Light Rain
6 2018-07-07    0.3        Light Rain
7 2018-07-08    0.0        No rain
8 2018-07-09    0.0        No rain

我想在初始数据帧中获得这些值的百分比(如 value_counts)的新列,如“小雨”、“无雨”等。因此,在我的数据框中,我有 12 月 1 日(例如)的 10 个观察值,其中 8 天是“小雨”,因此数据框中每个 12 月 1 日的百分比将为 80%。我想要这样的东西:

   Date        precipMM    Rain_Type.  Light_rain_prct.  No_rain_pct
0 2008-07-01    0.0        Light_rain      80             20
0 2008-07-02    0.0        No rain         30             70
0 2008-07-03    0.0        No rain         50             50

有什么快速的方法吗?我做了同样的事情,但只进行了很多操作(groupby、pivot_table 等),但由于数据集很大,因此计算它需要时间。

【问题讨论】:

    标签: python pandas dataframe time-series pivot-table


    【解决方案1】:
    print (df)
             Date  precipMM   Rain_Type
    0  2008-07-01       0.0     No rain
    1  2008-07-02       0.0     No rain
    2  2008-07-03       0.0     No rain
    3  2008-07-01       0.3  Light Rain
    4  2008-07-01       1.1  Light Rain
    5  2018-07-02       0.3  Light Rain
    6  2018-07-07       0.3  Light Rain
    7  2018-07-01       0.0     No rain
    8  2018-07-02       0.0     No rain
    

    对每个组使用 value_counts 并使用 unstack 进行整形,然后使用 add_suffix 进行新列名:

    df1 = (df.groupby('Date')['Rain_Type']
             .value_counts(normalize=True)
             .unstack(fill_value=0)
             .add_suffix('_pct'))
    

    另一种解决方案是使用crosstab 和参数normalize

    df1 = pd.crosstab(df['Date'], df['Rain_Type'],normalize=0).add_suffix('_pct')
    

    最后join 为原始:

    df2 = df.join(df1 * 100, on='Date')
    print (df2)
             Date  precipMM   Rain_Type  Light Rain_pct  No rain_pct
    0  2008-07-01       0.0     No rain       66.666667    33.333333
    1  2008-07-02       0.0     No rain        0.000000   100.000000
    2  2008-07-03       0.0     No rain        0.000000   100.000000
    3  2008-07-01       0.3  Light Rain       66.666667    33.333333
    4  2008-07-01       1.1  Light Rain       66.666667    33.333333
    5  2018-07-02       0.3  Light Rain       50.000000    50.000000
    6  2018-07-07       0.3  Light Rain      100.000000     0.000000
    7  2018-07-01       0.0     No rain        0.000000   100.000000
    8  2018-07-02       0.0     No rain       50.000000    50.000000
    

    【讨论】:

      【解决方案2】:

      使用pd.crosstab,后跟pd.merge。使用稍微修改的数据框:

      print(df)
          Date        precipMM  Rain_Type
      0 2008-07-01       0.0     Norain
      1 2008-07-01       0.0     Norain
      2 2008-07-01       0.0     Norain
      3 2008-07-01       0.0  LightRain
      4 2008-07-02       0.0     Norain
      5 2008-07-03       0.0     Norain
      6 2008-07-04       0.3  LightRain
      7 2008-07-05       1.1  LightRain
      
      df2 = pd.crosstab(df.Date,df.Rain_Type)
      df2 = (df2.div(df2.sum(axis=1), axis='rows') * 100).reset_index()
      
      df.merge(df2, on = 'Date')
      
         Date         precipMM  Rain_Type  LightRain  Norain
      0 2008-07-01       0.0     Norain       25.0    75.0
      1 2008-07-01       0.0     Norain       25.0    75.0
      2 2008-07-01       0.0     Norain       25.0    75.0
      3 2008-07-01       0.0  LightRain       25.0    75.0
      4 2008-07-02       0.0     Norain        0.0   100.0
      5 2008-07-03       0.0     Norain        0.0   100.0
      6 2008-07-04       0.3  LightRain      100.0     0.0
      7 2008-07-05       1.1  LightRain      100.0     0.0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-12
        • 2023-03-13
        • 2020-03-29
        相关资源
        最近更新 更多