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

如何计算Multi-Index DataFrame单sid会话平均行数并删除超阈值行

Pandas 多重索引DataFrame会话截断实现方案

前置要求

  • 依赖库:pandas
  • 处理前需保证每个sid分组下的数据已经按ts(页面到达时间)升序排列,避免截断的是错误的时序数据

步骤1:构造测试数据(生产环境可跳过)

import pandas as pd

# 构造业务数据
data = {
    'pid': ['page1', 'page2', 'page3', 'page4', 'page5', 'page1', 'page1', 'page2'],
    'ts': ['t1', 't2', 't3', 't4', 't5', 't4', 't5', 't6']
}
# 构造sid+vid的多重索引
index = pd.MultiIndex.from_tuples(
    [(1, 'A'), (1, 'A'), (1, 'A'), (1, 'A'), (1, 'A'), (2, 'B'), (3, 'C'), (3, 'C')],
    names=['sid', 'vid']
)
df = pd.DataFrame(data, index=index)

步骤2:计算每个sid会话的平均行数

# 按sid分组统计每个会话的行数,再求算术平均
session_size = df.groupby(level='sid').size()
avg_session_rows = session_size.mean()
print(f"平均会话行数:{avg_session_rows}")
# 示例输出:平均会话行数:2.6666666666666665,即需求中的8/3

步骤3:按阈值截断会话多余行

两种实现方式均可,大数量级场景下效率无明显差异:

方式1:直接用head截断

threshold = 3 # 可根据实际需求调整阈值
df_filtered = df.groupby(level='sid').head(threshold)

方式2:用cumcount过滤

threshold = 3
# 为每个sid内的行生成从0开始的序号,保留序号小于阈值的行
df_filtered = df[df.groupby(level='sid').cumcount() < threshold]

处理结果验证

输出df_filtered即可得到需求中给出的截断后数据,原多重索引结构保持不变。

内容的提问来源于stack exchange,提问作者S44

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:54:02