如何操作熊猫中的行块



我有一个大数据库(2.4亿行(被划分为块,块标记(sob(的开头是其中一列,130万个块。

我创建了一个block_start系列:

block_start = pd.series(df[df.sob == True].index)

并计算块长度系列:

block_len = block_start.shift(-1) - block_start.

现在我需要找出每个块是否在布尔列中至少包含一个信号(true(:

signals = []
for i in range(len(block_start)):
signals.append(df.signal[block_start[i]:block_start[i]+block_len[i]].any())

上述循环需要20分钟。有什么办法缩短它吗?

为了提高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)

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

最新更新