如何用大pandas的groupby输出来填充?

发布于 2021-01-29 18:05:28

我有一个具有4列(A,B,C,D)的数据框。D有一些NaN条目。我想用具有相同A,B,C值的D的平均值填充NaN值。

例如,如果A,B,C,D的值分别为x,y,z和Nan,那么我想将NaN值替换为A,B,C值的行的D平均值分别是x,y,z。

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

    df['D'].fillna(df.groupby(['A','B','C'])['D'].transform('mean')) 会比 apply

    In [2400]: df
    Out[2400]:
       A  B  C    D
    0  1  1  1  1.0
    1  1  1  1  NaN
    2  1  1  1  3.0
    3  3  3  3  5.0
    
    In [2401]: df['D'].fillna(df.groupby(['A','B','C'])['D'].transform('mean'))
    Out[2401]:
    0    1.0
    1    2.0
    2    3.0
    3    5.0
    Name: D, dtype: float64
    
    In [2402]: df['D'] = df['D'].fillna(df.groupby(['A','B','C'])['D'].transform('mean'))
    
    In [2403]: df
    Out[2403]:
       A  B  C    D
    0  1  1  1  1.0
    1  1  1  1  2.0
    2  1  1  1  3.0
    3  3  3  3  5.0
    

    细节

    In [2396]: df.shape
    Out[2396]: (10000, 4)
    
    In [2398]: %timeit df['D'].fillna(df.groupby(['A','B','C'])['D'].transform('mean'))
    100 loops, best of 3: 3.44 ms per loop
    
    
    In [2397]: %timeit df.groupby(['A','B','C'])['D'].apply(lambda x: x.fillna(x.mean()))
    100 loops, best of 3: 5.34 ms per loop
    


知识点
面圈网VIP题库

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

去下载看看