我需要做以下
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列中相同值的不同行的数据填充值的更快方法
答案 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