Python 填充前向条件结果

Python 填充前向条件结果,python,numpy,pandas,dataframe,vectorization,Python,Numpy,Pandas,Dataframe,Vectorization,我有一个带有列a和B的数据框。现在我想生成如下列C: A B C index 1 0 50 NaN 2 1 60 60 3 0 40 60 4 0 30 60 5 1 40 40 C如果A==1,则获取此行中B的值。然后此值将保留在接下来的行中,直到下次A==1。如何以矢量化方式执行此操作?您可以选择B的值,其中A==1,然后向前填充: a = pd.DataFrame({"A

我有一个带有列
a
B
的数据框。现在我想生成如下列
C

       A   B   C
index  
 1     0   50   NaN
 2     1   60   60
 3     0   40   60
 4     0   30   60 
 5     1   40   40

C
如果
A==1,则获取此行中
B
的值。然后此值将保留在接下来的行中,直到下次
A==1
。如何以矢量化方式执行此操作?

您可以选择B的值,其中A==1,然后向前填充:

a = pd.DataFrame({"A":[0,1,0,0,1], "B":[50,60,40,30,40]}, index=[1,2,3,4,5])
a["C"] = a.B[a.A == 1]
a = a.fillna(method="ffill")
ffill方法向前传播最后一次有效观测,以填充NAN。有关更多信息,请参阅

这使得:

   A   B   C
1  0  50 NaN
2  1  60  60
3  0  40  60
4  0  30  60
5  1  40  40

另一种方法,一行,似乎快一点:

In [301]: df['C'] = pd.Series(np.where(df.A==1, df.B, np.nan), index=df.index).ffill()

In [302]: df
Out[302]:
   A   B     C
1  0  50   NaN
2  1  60  60.0
3  0  40  60.0
4  0  30  60.0
5  1  40  40.0
设置500K行DF:

In [310]: %paste
def method1(a):
    a["C"] = a.B[a.A == 1]
    return a.fillna(method="ffill")

def method2(df):
    df['C'] = pd.Series(np.where(df.A==1, df.B, np.nan), index=df.index).ffill()
    return df
## -- End pasted text --

df = pd.concat([df] * 10**5, ignore_index=True)

In [313]: df.shape
Out[313]: (500000, 2)
时间:

In [311]: %timeit method1(df)
10 loops, best of 3: 95.3 ms per loop

In [312]: %timeit method2(df)
100 loops, best of 3: 17.8 ms per loop
有趣的是,我认为@Seabass的方法应该更快,但显然不是