You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Python中统计事件A两次出现之间的事件B发生次数

在Python中统计事件A两次出现之间的事件B发生次数

嗨,这需求很实用,而且你的提问格式超清晰,完全不用抱歉!看你的数据是表格形式,我默认你用pandas来处理啦,下面是一步步解决的方案:

首先,我们先把你的示例数据转换成pandas DataFrame(如果你已经有现成的DataFrame可以跳过这步):

import pandas as pd

# 构造示例数据
data = {
    'Date': ['2025-02-01']*7 + ['2025-02-02']*3 + ['2025-02-02'],
    'Time': ['03:51:40', '05:53:31', '07:55:05', '10:14:52', '12:17:01', '14:20:15', '20:26:04', '22:31:27', '03:50:48', '05:52:28', '14:00:45'],
    'Event': ['A', 'B', 'B', 'B', 'A', 'B', 'A', 'A', 'B', 'B', 'A']
}
df = pd.DataFrame(data)

接下来是核心步骤:我们需要给每一行标记它属于哪个「A区间」——也就是把当前行和它之后到下一个A之前的所有行,归到最近的那个A的组里。用cumsum()就能轻松实现:

# 生成分组标识:每遇到一个A,分组号加1
df['group'] = df['Event'].eq('A').cumsum()

然后统计每个分组里B的数量:

# 计算每个分组中B的出现次数
b_counts = df.groupby('group')['Event'].apply(lambda x: (x == 'B').sum())

最后筛选出所有Event为A的行,把对应的B计数匹配进去,再整理一下格式:

# 筛选A的行并添加B Count列
result = df[df['Event'] == 'A'].copy()
result['B Count'] = result['group'].map(b_counts)

# 去掉临时的group列,重置索引
result = result.drop('group', axis=1).reset_index(drop=True)
print(result)

运行这段代码后,输出结果就和你想要的完全一致啦:

Date      Time Event  B Count
0  2025-02-01  03:51:40     A        0
1  2025-02-01  12:17:01     A        3
2  2025-02-01  20:26:04     A        1
3  2025-02-01  22:31:27     A        0
4  2025-02-02  14:00:45     A        2

简单解释下逻辑:分组号是每次遇到A就递增,所以两个A之间的所有B都会被分到后一个A的组里,统计这个组的B数量,就是前一个A到当前A之间的B总数啦。如果两个A连续(比如示例里的第6和第7行),中间没有B,那计数就是0,完全符合你的需求。

备注:内容来源于stack exchange,提问作者RMAC52

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 19:48:01