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

pandas DataFrame高效过滤及melt宽转长实现方法

UK Biobank宽表转长表高效实现方案

直接用pandas原生宽转长接口一次性完成转换,不需要逐实例过滤、拆分拼接,同时兼容单测量项、多测量项场景,性能远高于逐实例循环处理的写法。

核心实现代码

import pandas as pd

# 示例数据(已加入多测量项测试列,可直接替换为真实数据集)
data = {'id': ['1', '2', '3', '4'],
        '3-0.0': [20, 21, 19, 18],
        '3-1.0': [10, 11, 29, 12],
        '3-2.0': [5, 6, 7, 8],
        '4-0.0': [120, 121, 119, 118],
        '4-1.0': [110, 111, 129, 112],
        '4-2.0': [105, 106, 107, 108]}
df = pd.DataFrame(data)

# 一次性完成宽转长+字段提取
fin = df.melt(
    id_vars="id",
    var_name="raw_col",
    value_name="measure"
).assign(
    # 按UK Biobank列名规则<测量项ID>-<实例号>.<数组索引>拆分字段
    measure_id = lambda x: x["raw_col"].str.split("-").str[0],
    instance = lambda x: x["raw_col"].str.split("-").str[1].str.split(".").str[0].astype(int)
).drop(columns=["raw_col"])

方案说明

  • 单测量项场景下,只需在最后drop的列列表中加入measure_id,即可得到需要的id/measure/instance三列结构,排序后和目标结果完全一致
  • 多测量项场景下,保留的measure_id列可直接区分不同测量指标,无需修改代码即可自动适配所有符合UK Biobank命名规则的字段列
  • 性能优势:全程只做一次表结构转换,没有逐列过滤、多次拼接的额外开销,数据量越大效率提升越明显
  • 兼容扩展:如果存在缺失值,直接在转换链末尾加.dropna(subset=["measure"])即可完成空值过滤;如果有性别、年龄等不需要转长的固定字段,直接加到id_vars参数列表中即可

输出示例(单测量项场景)

idmeasureinstance
1200
1101
152
2210
2111
262
3190
3291
372
4180
4121
482

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:18:34