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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:01:25