使用groupby的 pandas fillna [英] Pandas fillna using groupby
问题描述
我正在尝试使用具有相似列值的行来估算值.
I am trying to impute the value using row with similar columns' values.
例如,我有这个数据框
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']列中
I wanted to using the keys of column ['one'] and ['two'] which is similar and if column ['three'] is not entirely nan then impute the existing value from a row of similar keys with value in column ['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不包含任何值,因为现有值不存在.
You can see that keys 1 and 3 do not contain any value because the existing value does not exists.
我尝试使用groupby fillna()
I have tried using groupby fillna()
df['three'] = df.groupby(['one','two'])['three'].fillna()
这给了我一个错误.
我尝试了正向填充,这给了我一个相当奇怪的结果,它代替了正向填充列2.我正在使用此代码进行向前填充.
I have tried forward fill which give me rather strange result where it forward fill the column 2 instead. I am using this code for forward fill.
df['three'] = df.groupby(['one','two'], sort=False)['three'].ffill()
谢谢您的时间.
推荐答案
如果每组只有一个非NaN值,则每组使用ffill
(正向填充)和bfill
(向后填充),因此需要apply
与lambda
:
If only one non NaN value per group use ffill
(forward filling) and bfill
(backward filling) per group, so need apply
with 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
按组:
But if multiple value per group and need replace NaN
by some constant - e.g. mean
by group:
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
这篇关于使用groupby的 pandas fillna的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!