Pandas实现按标注者与事件合并区间并集的方法
按标注者和事件合并区间并集的实现方案
你可以通过Pandas分组结合piso库来实现按annotator和event分组合并区间并集的需求,具体步骤如下:
1. 依赖安装
确保已安装所需库:
pip install pandas piso
2. 完整代码实现
import pandas as pd import piso # 构造输入数据 data = { 'annotator': [3, 3, 3, 3, 5, 5, 5], 'event': ['birds', 'birds', 'voices', 'traffic', 'voices', 'voices', 'traffic'], 'interval_presence': [[0,5], [7,9], [1,2], [1,7], [4,7], [5,10], [0,1]] } df = pd.DataFrame(data) # 将列表格式的区间转换为Pandas Interval类型(闭区间) df['interval_presence'] = df['interval_presence'].apply( lambda x: pd.Interval(left=x[0], right=x[1], closed='both') ) # 按标注者和事件分组,对每组区间执行并集合并 result = df.groupby(['annotator', 'event'])['interval_presence'].apply(piso.union).reset_index() # 将合并后的Interval对象转回列表格式,匹配期望输出 def interval_to_list(interval_obj): if isinstance(interval_obj, pd.api.extensions.ExtensionArray): return [[iv.left, iv.right] for iv in interval_obj] else: return [[interval_obj.left, interval_obj.right]] result['interval_presence'] = result['interval_presence'].apply(interval_to_list) # 处理单个区间的显示(去掉外层列表,和示例一致) result['interval_presence'] = result['interval_presence'].apply(lambda x: x[0] if len(x) == 1 else x) print(result)
3. 代码说明
- 区间类型转换:piso库需要处理标准的区间对象,因此先将输入的列表转换为Pandas的
Interval类型,指定closed='both'确保区间包含两端值。 - 分组合并:通过
groupby(['annotator', 'event'])按标注者和事件分组,再用piso.union对每组的区间执行并集合并操作。 - 格式转换:将合并后的区间对象转回列表格式,并处理单个区间的显示格式,使其与你期望的输出一致。
输出结果
annotator event interval_presence 0 3 birds [[0, 5], [7, 9]] 1 3 traffic [1, 7] 2 3 voices [1, 2] 3 5 traffic [0, 1] 4 5 voices [4, 10]
内容的提问来源于stack exchange,提问作者M.Tailleur
相关产品推荐
相关产品推荐

