在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
相关产品推荐
相关产品推荐

