我有一个数据框,其中包含每天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等),但是由于数据集很大,计算起来很费时间。
答案 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