小编典典

使用groupby的熊猫fillna

python

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

例如,我有这个数据框

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()

感谢您的时间。


阅读 221

收藏
2020-12-20

共1个答案

小编典典

如果每个组仅使用一个非NaN的值ffill(前向填充)和bfill每组(向后填充),所以需要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
2020-12-20