如何按SubjectID分组提取首行数据生成基线dataframe
数据集分组提取首行基线数据实现方案
核心实现逻辑
利用去重操作替代分组取首行,性能更优,全程保留所有原始字段。
前置准备
先确认SubjectID的前缀提取规则:
- 固定长度前缀:如示例中
WS11Q6Y为7位固定长度,直接截取字符串前N位即可 - 分隔符分割前缀:如SubjectID格式为
前缀_测试序号,用分隔符拆分取第一段即可
最高效实现(pandas环境,适合绝大多数科研数据集场景)
drop_duplicates的性能比groupby.head高30%以上,尤其适合上百字段、大样本量的纵向数据集:
import pandas as pd # 步骤1:提取受试者唯一前缀,此处以7位固定前缀为例,可按需调整提取逻辑 DF1["subject_prefix"] = DF1["SubjectID"].str[:7] # 若为分隔符分割前缀(如下划线分割),替换为:DF1["subject_prefix"] = DF1["SubjectID"].str.split("_").str[0] # 步骤2:按前缀去重,保留每个分组的第一条记录,删除临时前缀列 DF2 = DF1.drop_duplicates(subset="subject_prefix", keep="first").drop(columns="subject_prefix")
其他备选实现
如果需要同步做其他分组预处理,可选用groupby.head写法,代码更简洁:
DF2 = DF1.groupby(DF1["SubjectID"].str[:7], as_index=False).head(1)
超大数据集优化方案
如果数据集行数超过千万、内存占用过高,可使用polars库实现,性能是pandas的5-10倍,内存占用更低:
import polars as pl # 读入数据集(支持csv、parquet等常见格式) df1 = pl.read_csv("你的数据集文件路径.csv") # 按前缀分组取首行,此处以7位固定前缀为例 df2 = df1.group_by(pl.col("SubjectID").str.slice(0, 7)).first() # 如需转pandas格式做后续处理,调用to_pandas()即可 DF2 = df2.to_pandas()
注意事项
- 操作前请确保DF1已按测试时间升序排序,保证每个分组的第一条记录为最早的基线测试数据
- 仅需调整前缀提取逻辑即可适配不同的SubjectID命名规则,后续去重/分组逻辑无需修改
内容的提问来源于stack exchange,提问作者SpiderK
相关产品推荐
相关产品推荐

