使用groupby的 pandas fillna [英] Pandas fillna using groupby

查看:407
本文介绍了使用groupby的 pandas fillna的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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(向后填充),因此需要applylambda:

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆