2017-09-24 185 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

这正是我所需要的。谢谢! –