首页 文章

使用groupby的熊猫fillna

提问于
浏览
3

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

例如,我有这个数据帧

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 回答

  • 10

    如果每个组只有一个非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
    

相关问题