如何聚合集合列?Pandas DataFrame按15分钟周期提取唯一ID
解决Pandas按15分钟聚合唯一ID集合的问题
嘿,我来帮你搞定这个需求!你之前用sum没成功很正常,因为sum对列表/集合只是简单拼接(甚至集合会直接报错),没法帮你完成去重操作。下面给你一步步拆解实现方法:
第一步:先把时间列转成可识别的格式
首先得确保你的时间列是Pandas能处理的datetime类型,不然没法按时间窗口聚合:
import pandas as pd df['timestamp'] = pd.to_datetime(df['timestamp']) # 替换成你实际的时间列名
如果你的ID集合列是字符串形式(比如"[1,2,3]"),得先转成列表/集合才能处理:
import ast df['id_set'] = df['id_set'].apply(ast.literal_eval) # 替换成你实际的ID集合列名
第二步:写个自定义聚合函数
我们需要一个函数,把每个15分钟窗口里的所有ID集合合并,然后去重得到唯一ID。这里推荐用itertools.chain来高效合并,数据量大的时候更省心:
from itertools import chain def collect_unique_ids(series): # 把窗口内所有ID集合拆成单个ID,转成集合去重后再转回列表(列表格式可选) all_ids = chain.from_iterable(series) return list(set(all_ids))
要是你不想用itertools,用基础写法也可以:
def collect_unique_ids(series): all_ids = [] for ids in series: all_ids.extend(ids) return list(set(all_ids))
第三步:按15分钟窗口执行聚合
用resample方法指定15分钟周期('15T'),然后应用上面的聚合函数就行:
# 方法1:把时间列设为索引后聚合 result = df.set_index('timestamp').resample('15T')['id_set'].apply(collect_unique_ids).reset_index() # 方法2:不想改索引的话,用`on`参数指定时间列 result = df.resample('15T', on='timestamp')['id_set'].apply(collect_unique_ids).reset_index()
举个完整的例子
假设你的原始数据是这样的:
data = { 'timestamp': ['2024-05-20 09:00:00', '2024-05-20 09:10:00', '2024-05-20 09:16:00', '2024-05-20 09:25:00'], 'id_set': [[1,2,3], [2,4], [3,5], [5,6]] } df = pd.DataFrame(data)
运行上面的代码后,result会输出:
timestamp id_set 0 2024-05-20 09:00:00 [1, 2, 3, 4] 1 2024-05-20 09:15:00 [3, 5] 2 2024-05-20 09:30:00 [5, 6]
这样每个15分钟窗口里的唯一ID就都提取出来啦!
内容的提问来源于stack exchange,提问作者pmdaly
相关产品推荐
相关产品推荐

