簡體   English   中英

對於給定的分組,Pandas將nan替換為平均值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM