我有一个大数据库(2.4亿行),分为多个块,其中以块标记(sob)开头为列之一,即130万个块。
我创建了一个block_start系列:
block_start = pd.series(df[df.sob == True].index)
并计算块长度序列:
block_len = block_start.shift(-1) - block_start.
现在,我需要在布尔列中查找每个块是否包含至少一个信号(真):
signals = []
for i in range(len(block_start)):
signals.append(df.signal[block_start[i]:block_start[i]+block_len[i]].any())
以上循环需要20分钟。 任何想法如何缩短呢?
答案 0 :(得分:1)
要获得出色的 1 性能,您可能希望让NumPy接手。
(从@jpp的答案借来的数据)
v = np.cumsum(df['sob'])
df['any_flag'] = v.isin(v[df.signal].unique())
print(df)
signal sob any_flag
0 True True True
1 False False True
2 True False True
3 False False True
4 False True True
5 False False True
6 True False True
7 False True False
8 False False False
9 False False False
1。您的里程可能会有所不同。
df = pd.concat([df] * 10000, ignore_index=True)
%timeit df['any_flag'] = (
df.groupby(df['sob'].cumsum())['signal'].transform('any'))
%%timeit
v = np.cumsum(df['sob'])
df['any_flag'] = v.isin(v[df.signal].unique())
10.9 ms ± 610 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
4.5 ms ± 19.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
答案 1 :(得分:0)
groupby
+ cumsum
+ any
您可以groupby
系列sob
的累计金额:
df = pd.DataFrame({'signal': [True, False, True, False, False,
False, True, False, False, False],
'sob': [True, False, False, False, True,
False, False, True, False, False]})
df['any_flag'] = df.groupby(df['sob'].cumsum())['signal'].transform('any')
print(df)
signal sob any_flag
0 True True True
1 False False True
2 True False True
3 False False True
4 False True True
5 False False True
6 True False True
7 False True False
8 False False False
9 False False False