Подсчитайте количество случаев за каждый день в панде - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть данные с историческими данными о погоде с 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) в исходном кадре данных.Итак, в моем информационном кадре у меня есть 10 наблюдений за 1 декабря (ex), и 8 дней из них были с «Легким дождем», поэтому процентное соотношение для каждого 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 и т. Д.), Но для его расчета требуется время, так как набор данных большой.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018
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
0 голосов
/ 12 декабря 2018

Используйте 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
...