如何计算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
相关产品推荐
相关产品推荐

