alternative Methode, Einzeiler, die schnellen Bit zu sein scheint:
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
Setup-500K Reihen 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)
Timing:
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
interessant, ich dachte, dass @ Seabass Methode schneller sein sollte, aber anscheinend nicht, dass es ...
ja, das ist es, dank @Seabass –