使用groupby的熊猫fillna

时间:2017-09-24 14:30:12

标签: python pandas

我试图使用具有相似列值的行来估算值。

例如,我有这个数据框

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

我想使用列['one']和['two']的键,这是相似的,如果列['three']不完全是nan,那么从一行类似键的值中输入现有值在['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不包含任何值,因为现有值不存在。

我尝试过使用groupby fillna()

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

给了我一个错误。

我尝试了向前填充,这给了我相当奇怪的结果,它向前填充第2列。我正在使用此代码进行前向填充。

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

感谢您的时间。

1 个答案:

答案 0 :(得分:13)

如果每个组中只有一个非NaN值使用ffill(向前填充)和bfill(向后填充),那么apply需要lambda

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