[英]Pandas replace nan with mean value for a given grouping
我有一個大型的數據集:
period_id gic_subindustry_id operating_mgn_fym5 operating_mgn_fym4 317 201509 25101010 13.348150 11.745965
682 201509 20101010 10.228725 10.473917
903 201509 20101010 NaN 17.700966
1057 201509 50101010 27.858305 28.378040
1222 201509 25502020 15.598956 11.658813
2195 201508 25502020 27.688324 22.969760
2439 201508 45202020 NaN 27.145216
2946 201508 45102020 17.956425 18.327724
在實踐中,我每年有數千個值可以追溯到25年,並且有多個(10+)列。
我試圖用該時間段的gic_industry_id中值/平均值替換NaN值。
我嘗試了一些類似的東西
df.fillna(df.groupby('period_id','gic_subindustry_id')。transform('mean')),但這似乎很緩慢(我在幾分鍾后停止了它)。
在我看來,它可能緩慢的原因是由於重新計算每個遇到的NaN的平均值。 為了解決這個問題,我認為計算每個period_id的均值,然后用這個替換/映射每個NaN可能要快得多。
means = df.groupby(['period_id', 'gic_subindustry_id']).apply(lambda x:x.mean())
輸出:
operating_mgn_fym5 operating_mgn_fym4 operating_mgn_fym3 operating_mgn_fym2
period_id gic_subindustry_id
201509 45202030 1.622685 0.754661 0.755324 321.295665
45203010 1.447686 0.226571 0.334280 12.564398
45203015 0.733524 0.257581 0.345450 27.659407
45203020 1.322349 0.655481 0.468740 19.823722
45203030 1.461916 1.181407 1.487330 16.598534
45301010 2.074954 0.981030 0.841125 29.423161
45301020 2.621158 1.235087 1.550252 82.717147
事實上,這要快得多(30-60秒)。
但是,我正在努力弄清楚如何將NaN映射到這些方法。 事實上,這是執行此映射的“正確”方式嗎? 速度實際上並不是最重要的,但<60秒會很好。
如果數據幀具有相同的結構(由as_index=False
給出), as_index=False
可以使用fillna
結果使用fillna
:
df.fillna(df.groupby(['period_id', 'gic_subindustry_id'], as_index=False).mean())
#In [60]: df
#Out[60]:
# period_id gic_subindustry_id operating_mgn_fym5 operating_mgn_fym4
#0 201508 25502020 27.688324 22.969760
#1 201508 45102020 17.956425 18.327724
#2 201508 45202020 NaN 27.145216
#3 201509 20101010 10.228725 14.087442
#4 201509 25101010 13.348150 11.745965
#5 201509 25502020 15.598956 11.658813
#6 201509 50101010 27.858305 28.378040
#7 201508 45102020 17.956425 18.327724
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.