2017-09-24 218 views
1

我想要使用具有相似列的值的行進行估算。大熊貓使用groupby

例如,我有這樣的數據幀

one | two | three 
1  1  10 
1  1  nan 
1  1  nan 
1  2  nan 
1  2  20 
1  2  nan 
1  3  nan 
1  3  nan 

我想使用的柱[「一個」]鍵和[「2」],其類似於並且如果柱[「三」]不完全楠然後在列值歸咎於相似鍵的行現有的值[「3」]

這裏是我的願望結果

one | two | three 
1  1  10 
1  1  10 
1  1  10 
1  2  20 
1  2  20 
1  2  20 
1  3  nan 
1  3  nan 

可以看到,鍵1和3不包含任何價值因爲t他現有的價值不存在。

我一直在使用這給了我一個錯誤GROUPBY fillna()

df['three'] = df.groupby(['one','two'])['three'].fillna() 

嘗試。

我已經嘗試了向前填充,這給我相當奇怪的結果,而不是向前填充列2。我正在使用此代碼進行前向填充。

df['three'] = df.groupby(['one','two'], sort=False)['three'].ffill() 

謝謝你的時間。

回答

4

如果每組使用ffill(正向填充)和每組bfill(向後填充)只有一個非NaN的值,所以需要applylambda

df['three'] = df.groupby(['one','two'], sort=False)['three'] 
       .apply(lambda x: x.ffill().bfill()) 
print (df) 
    one two three 
0 1 1 10.0 
1 1 1 10.0 
2 1 1 10.0 
3 1 2 20.0 
4 1 2 20.0 
5 1 2 20.0 
6 1 3 NaN 
7 1 3 NaN 

但是,如果每組的多個值和需要更換NaN由一些常量 - 例如mean按組:

print (df) 
    one two three 
0 1 1 10.0 
1 1 1 40.0 
2 1 1 NaN 
3 1 2 NaN 
4 1 2 20.0 
5 1 2 NaN 
6 1 3 NaN 
7 1 3 NaN 

df['three'] = df.groupby(['one','two'], sort=False)['three'] 
       .apply(lambda x: x.fillna(x.mean())) 
print (df) 
    one two three 
0 1 1 10.0 
1 1 1 40.0 
2 1 1 25.0 
3 1 2 20.0 
4 1 2 20.0 
5 1 2 20.0 
6 1 3 NaN 
7 1 3 NaN 
+0

這正是我所需要的。謝謝! –