使用groupby的熊猫fillna

发布于 2021-01-29 19:34:29

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

例如,我有这个数据框

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

感谢您的时间。

关注者
0
被浏览
66
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如果每个组仅使用一个非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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看