从嵌套列表提取值转DataFrame遇报错,求优化实现方案
问题分析与解决方案
错误原因
- 对象访问方式错误:报错
'TeamRecord' object is not subscriptable说明你的data元素不是字典,而是TeamRecord类实例,不能用下标[]访问属性,需用点.访问(比如record.team而非record['team'])。 - 语法错误:
get是字典方法,需用括号()调用,你写成了get['games'],正确写法为record.total.get('games');若total也是对象,直接用record.total.games即可。
修正后的基础代码
假设TeamRecord属性与原字典键名一致,修正后的循环代码如下:
import pandas as pd df = pd.DataFrame(columns=['team', 'games', 'wins', 'losses', 'ties']) for record in data: try: # 改用属性访问 team = record.team games = record.total.games wins = record.total.wins losses = record.total.losses ties = record.total.ties new_row = {'team': team, 'games': games, 'wins': wins, 'losses': losses, 'ties': ties} df = df._append(new_row, ignore_index=True) # pandas 2.0+推荐用_df._append,append已弃用 except AttributeError as e: print(f"Skipping record due to missing attribute: {e}") print(df)
更简便的实现方式
方式1:列表推导式批量生成数据
无需手动循环追加,直接生成数据列表后创建DataFrame,效率更高:
import pandas as pd # 列表推导式提取所需字段,可按需过滤缺失属性的记录 data_list = [ { 'team': record.team, 'games': record.total.games, 'wins': record.total.wins, 'losses': record.total.losses, 'ties': record.total.ties } for record in data if hasattr(record, 'team') and hasattr(record.total, 'games') ] df = pd.DataFrame(data_list) print(df)
方式2:若原始数据是字典列表,用json_normalize一键处理
如果你的data原本就是字典列表(而非TeamRecord对象),用pandas内置的json_normalize可以快速展开嵌套结构:
import pandas as pd # 展开嵌套字典并指定字段 df = pd.json_normalize(data)[['team', 'total.games', 'total.wins', 'total.losses', 'total.ties']] # 重命名列名 df.columns = ['team', 'games', 'wins', 'losses', 'ties'] print(df)
内容的提问来源于stack exchange,提问作者WillyTheWalrus_123
相关产品推荐
相关产品推荐

