Pandas如何统计每个长事件时间区间内包含的短事件记录数?
解决方法
方法1:直接使用你编写的函数配合apply实现
你写的计数逻辑是正确的,只需要将函数应用在长事件表上即可,因为我们需要为每一个长事件统计对应的短事件数量,代码如下:
# 预先定义好的计数函数 def count_records_in_time_range(df, start, end): return len(df[(df['start'] >= start) & (df['end'] <= end)]) # 假设长事件表变量名为df_long,短事件表变量名为df_short df_long['count of sub events'] = df_long.apply( lambda row: count_records_in_time_range(df_short, row['start'], row['end']), axis=1 )
运行后df_long就是你需要的结果。
方法2:用IntervalIndex优化性能(适合大数据量场景)
如果你的数据量较大,逐行apply的效率偏低,可以用Pandas的区间索引实现批量匹配,性能提升明显:
import pandas as pd # 为长事件表创建闭区间索引 df_long = df_long.set_index(pd.IntervalIndex.from_arrays( df_long['start'], df_long['end'], closed='both' )) # 匹配每个短事件所属的长事件区间,统计各区间数量 event_counts = df_short['start'].apply( lambda x: df_long.index.get_indexer([x])[0] ).value_counts().sort_index() # 将计数结果回写长事件表 df_long['count of sub events'] = event_counts.values # 重置索引恢复原始结构 df_long = df_long.reset_index(drop=True)
注:如果你的业务逻辑里时间区间是左闭右开规则,只需要将上面的
closed='both'改成closed='left',同时调整计数函数里的判断条件即可,你提供的示例中长短事件边界完全对齐,两种规则结果一致。
内容的提问来源于stack exchange,提问作者Yanirmr
相关产品推荐
相关产品推荐

