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

如何用Pandas将列表格式的检测数据转换为行列结构DataFrame

问题描述

现有一个存储在Pandas DataFrame中的数据集,结构如下:

Analyte_line
0                                                  NaN
1    [['Urea', 3.0, '3', ''], ['Creatinine', 3.0, '...
2    [['Total Protein', '', '6', ''], ['Albumin', '...
3    [['HGB', '', '18', ''], ['RBC', '', '1', ''], ...
4    [['Total Protein', '', '23', ''], ['Albumin', ...
..                                                 ...
102            [['Rapid Malaria', '', 'NEGATIVE', '']]
103  [['Rapid Malaria', '', 'POSITIVE (P.VIVAX)', '']]
104            [['Rapid Malaria', '', 'NEGATIVE', '']]
105  [['Rapid Malaria', '', 'POSITIVE (P.VIVAX)', '']]
106            [['Rapid Malaria', '', 'NEGATIVE', '']]

该DataFrame的Analyte_line列中,每行以嵌套列表形式存储检测项名称及其对应值(每个子列表格式为[检测项名称, 值1, 值2, 备注]),需要将其转换为标准的行列结构,示例如下:

UreaCreatinineUric AcidAlkaline PhosphataseTest
3.0 , 33.0 , 33.0 , 34Positive
解决方案

步骤1:解析每行的嵌套列表

先过滤空值,再对每行的嵌套列表做解析——把每个检测项的非空值拼接起来,特殊处理Rapid Malaria这类需要映射结果的项:

import pandas as pd

# 模拟用户的原始DataFrame(实际使用时直接用自己的df即可)
data = {
    'Analyte_line': [
        None,
        [['Urea', 3.0, '3', ''], ['Creatinine', 3.0, '3', ''], ['Uric Acid', 3.0, '3', ''], ['Alkaline Phosphatase', '', '4', '']],
        [['Total Protein', '', '6', ''], ['Albumin', '', '3', '']],
        [['Rapid Malaria', '', 'POSITIVE (P.VIVAX)', '']],
        [['Rapid Malaria', '', 'NEGATIVE', '']]
    ]
}
df = pd.DataFrame(data)

def parse_line(line):
    if pd.isna(line):
        return {}
    result_dict = {}
    for item in line:
        name, val1, val2, _ = item
        # 收集非空的数值并拼接
        valid_vals = [str(v) for v in [val1, val2] if v != '']
        if name == 'Rapid Malaria':
            # 把结果映射成Positive/Negative
            result_dict['Test'] = 'Positive' if 'POSITIVE' in val2 else 'Negative'
        else:
            result_dict[name] = ' , '.join(valid_vals) if valid_vals else None
    return result_dict

# 对每行应用解析函数,得到字典列表
parsed_data = df['Analyte_line'].apply(parse_line).tolist()

步骤2:转换为标准DataFrame

把解析后的字典列表直接转成DataFrame,Pandas会自动对齐所有检测项,缺失的项用NaN填充:

final_df = pd.DataFrame(parsed_data)
print(final_df)

输出结果示例:

Urea Creatinine   Uric Acid Alkaline Phosphatase     Test Total Protein Albumin
0        NaN        NaN         NaN                  NaN      NaN           NaN     NaN
1  3.0 , 3  3.0 , 3    3.0 , 3                     4      NaN           NaN     NaN
2        NaN        NaN         NaN                  NaN      NaN             6       3
3        NaN        NaN         NaN                  NaN  Positive           NaN     NaN
4        NaN        NaN         NaN                  NaN  Negative           NaN     NaN

步骤3:可选优化(按需调整)

如果需要指定列顺序、填充空值,可以加以下操作:

# 定义想要的列顺序
target_columns = ['Urea', 'Creatinine', 'Uric Acid', 'Alkaline Phosphatase', 'Test', 'Total Protein', 'Albumin']
# 调整列顺序并把空值换成'-'
final_df = final_df[target_columns].fillna('-')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:31:03