在熊猫数据框中计算每天发生的次数

时间:2018-12-12 09:53:44

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

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

connect

我想获得新列,如“ Light Rain”,“ No Rain”等,并在初始数据帧中包含这些值的百分比(如value_counts)。因此,在我的数据框中,我有12个1月1日(e.x)的观测值,并且距它们有8天是“小雨”,因此数据框中每个12月1日的百分比为80%。我想要这样的东西:

   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

有什么快速的方法可以做到吗?我做了同样的事情,但是只做了很多操作(groupby,pivot_table等),但是由于数据集很大,计算起来很费时间。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

使用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