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

如何从元组列表创建DataFrame并过滤结构不一致的元组

解决方案

你需要在遍历元组时增加结构校验逻辑,过滤掉不符合要求的异常元组,同时修正原代码中函数无返回值的问题,完整可运行代码如下:

import pandas as pd

q1 =[('energy level has been raised', 3317,
[{'ResultId': 1, 'CompletedOn': '2021-01-07T10:35:18.29+01:00', 'EnteredValue': None, 'EnteredOn': '2021-11-03T13:22:48.91+01:00', 'TextValue': None},
{'ResultId': 2, 'CompletedOn': '2021-01-07T10:38:19.12+01:00', 'EnteredValue': None, 'EnteredOn': '2021-11-03T13:28:11.267+01:00', 'TextValue': None}, 
{'ResultId': 3, 'CompletedOn': '2021-11-03T13:09:19.333+01:00', 'EnteredValue': None, 'EnteredOn': '2021-11-03T13:09:19.333+01:00', 'TextValue': None},
{'ResultId': 4, 'CompletedOn': None, 'EnteredValue': None, 'EnteredOn': None, 'TextValue': None},
{'ResultId': 5, 'CompletedOn': None, 'EnteredValue': None, 'EnteredOn': None, 'TextValue': None}, 
{'ResultId': 6, 'CompletedOn': None, 'EnteredValue': None, 'EnteredOn': None, 'TextValue': None}, 
{'ResultId': 7, 'CompletedOn': None, 'EnteredValue': None, 'EnteredOn': None, 'TextValue': None}],
'energy level has fallen down'),
({'code': '', 'message': 'Exception LS-27186:01 (4411459)'},)]

def create_record(record):
    pd_record = {
        'ResultID': record['ResultId'],
        # 可按需补充其他要提取的字段
        'CompletedOn': record['CompletedOn'],
        'EnteredValue': record['EnteredValue'],
        'EnteredOn': record['EnteredOn'],
        'TextValue': record['TextValue']
    }
    return pd_record

# 增加过滤条件:仅保留结构符合要求的元组
df1 = pd.DataFrame.from_records([create_record(record) for tup in q1 if len(tup)>=3 and isinstance(tup[2], list) for record in tup[2]])

print(df1.head())

核心改动说明

  • 补全create_record函数的return语句,原代码缺少返回值会导致生成的数据集为空
  • 列表推导式中新增if len(tup)>=3 and isinstance(tup[2], list)过滤条件,自动跳过没有第三个元素、或第三个元素不是列表的元组,避免触发索引越界错误
  • 修正df1.head的调用逻辑,增加括号才会执行方法输出前几行数据

高容错性备选方案

如果数据中存在更多未知异常结构,可以用try-except捕获所有异常,彻底避免报错:

valid_records = []
for tup in q1:
    try:
        record_list = tup[2]
        if not isinstance(record_list, list):
            continue
        for record in record_list:
            valid_records.append(create_record(record))
    except (IndexError, KeyError):
        # 跳过所有结构不符合要求的元组、字段缺失的记录
        continue

df1 = pd.DataFrame.from_records(valid_records)

该写法会自动跳过所有索引异常、字段缺失的无效数据,稳定性更高。

内容的提问来源于stack exchange,提问作者Al-Andalus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:15:04