如何从元组列表创建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
相关产品推荐
相关产品推荐

