如何使用基于匹配的另一行的数据填充np.nan值

时间:2017-12-22 09:04:19

标签: python pandas

我需要做以下

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列中的日期。 它应该最终看起来像这样: -

   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列中相同值的不同行的数据填充值的更快方法

1 个答案:

答案 0 :(得分:2)

您可以使用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