代码之家  ›  专栏  ›  技术社区  ›  desmond

如何填写np。nan值与另一行基于匹配的数据

  •  3
  • desmond  · 技术社区  · 8 年前

    我需要做以下工作

    a=[1,2,3,4,5]
    c=[0,100,100,200,200,0]
    b=['2013-06-10', np.nan, '2013-02-15', np.nan, '2013-05-15']
    df=pd.DataFrame({'a':a,'b':b,'c':c})
    

    这将提供:

       a           b    c
    0  1  2013-06-10  100
    1  2         NaN  100
    2  3  2013-02-15  200
    3  4         NaN  200
    4  5  2013-05-15  100
    

    我想根据C列中的值,在前一行中查找相同的值,并在B列中填充日期,当其为null时。 最终应该是这样的:-

       a           b    c
    0  1  2013-06-10  100
    1  2  2013-06-10  100
    2  3  2013-02-15  200
    3  4  2013-02-15  200
    4  5  2013-05-15  100
    

    目前,我使用apply lambda row-wise函数来填充日期,但由于我的原始数据有数百万行,因此速度大大降低。我想知道是否有人知道一种更快的方法,可以使用基于C列中相同值的不同行的数据填充NA值

    1 回复  |  直到 8 年前
        1
  •  3
  •   jezrael    8 年前

    您可以使用 ffill :

    df['b'] = df.groupby('c')['b'].ffill()
    print (df)
       a           b    c
    0  1  2013-06-10  100
    1  2  2013-06-10  100
    2  3  2013-02-15  200
    3  4  2013-02-15  200
    4  5  2013-05-15  100
    

    此外,如果某个组的第一个值为 NaN 在里面 b 使用 apply ,因为每个组都需要应用这两个功能:

    print (df)
       a           b    c
    0  1         NaN  100 <- NaN
    1  1  2013-06-10  100
    2  2         NaN  100
    3  3  2013-02-15  200
    4  4         NaN  200
    5  5  2013-05-15  100
    
    
    df['b'] = df.groupby('c')['b'].apply(lambda x: x.ffill().bfill())
    print (df)
       a           b    c
    0  1  2013-06-10  100
    1  1  2013-06-10  100
    2  2  2013-06-10  100
    3  3  2013-02-15  200
    4  4  2013-02-15  200
    5  5  2013-05-15  100