从嵌套字典列表提取元素到Pandas DataFrame时遇TypeError问题求助
提取字典列表嵌套键到DataFrame的问题解决
问题背景
你有一个包含嵌套字典的列表l1,想要提取特定的顶层和嵌套键值对到Pandas DataFrame中,缺失的键用N/A填充,但运行代码时遇到了TypeError错误。
错误原因
看一下你代码里的这行:
i.get(['B1']['bc'],'N/A')
这里的问题出在['B1']['bc']——你试图用字符串'bc'去索引列表['B1'],但列表只能用整数或者切片作为索引,所以Python抛出了TypeError: list indices must be integers or slices, not str。
正确的嵌套键获取逻辑应该是先获取外层字典的键,再从外层字典的结果里获取内层键,而且要处理外层键不存在的情况(比如某个元素没有B1键),避免触发KeyError。
修正后的代码
方式1:修复循环append的写法
我们用两次get()方法来处理嵌套结构:第一次获取外层键(比如B1),如果不存在就返回空字典{};第二次从这个结果里获取内层键(比如bc),不存在就返回'N/A'。
import pandas as pd # 示例测试数据 l1 = [ {'A1': 'string', 'B1': {'ba': 'string', 'bb': 'string', 'bc': 'string', 'bd': 'string', 'be': 'string'}, 'C1': {'ca': 'string', 'cb': [[[123,123],[123,123]]]}, 'D1': 'string'}, {'A1': 'string', 'B1': {'ba': 'string', 'bb': 'string', 'bd': 'string', 'be': 'string'}, 'C1': {'ca': 'string', 'cb': [[[123,123],[123,123]]]}, 'D1': 'string'}, {'A1': 'string', 'B1': {'ba': 'string', 'bb': 'string', 'bc': 'string', 'be': 'string'}, 'C1': {'ca': 'string', 'cb': [[[123,123],[123,123]]]}, 'D1': 'string'} ] temp_df = pd.DataFrame(columns=['bc','bd','cb','D1']) for item in l1: # 处理B1下的bc和bd bc_val = item.get('B1', {}).get('bc', 'N/A') bd_val = item.get('B1', {}).get('bd', 'N/A') # 处理C1下的cb cb_val = item.get('C1', {}).get('cb', 'N/A') # 处理顶层D1 d1_val = item.get('D1', 'N/A') temp_df = temp_df.append( {'bc': bc_val, 'bd': bd_val, 'cb': cb_val, 'D1': d1_val}, ignore_index=True ) print(temp_df)
方式2:更高效的列表推导式写法
Pandas的append()方法在循环中多次调用效率较低(尤其是数据量大的时候),推荐先把所有数据整理成字典列表,再一次性转成DataFrame:
import pandas as pd l1 = [ {'A1': 'string', 'B1': {'ba': 'string', 'bb': 'string', 'bc': 'string', 'bd': 'string', 'be': 'string'}, 'C1': {'ca': 'string', 'cb': [[[123,123],[123,123]]]}, 'D1': 'string'}, {'A1': 'string', 'B1': {'ba': 'string', 'bb': 'string', 'bd': 'string', 'be': 'string'}, 'C1': {'ca': 'string', 'cb': [[[123,123],[123,123]]]}, 'D1': 'string'}, {'A1': 'string', 'B1': {'ba': 'string', 'bb': 'string', 'bc': 'string', 'be': 'string'}, 'C1': {'ca': 'string', 'cb': [[[123,123],[123,123]]]}, 'D1': 'string'} ] # 先构建数据列表 data = [ { 'bc': item.get('B1', {}).get('bc', 'N/A'), 'bd': item.get('B1', {}).get('bd', 'N/A'), 'cb': item.get('C1', {}).get('cb', 'N/A'), 'D1': item.get('D1', 'N/A') } for item in l1 ] # 一次性生成DataFrame temp_df = pd.DataFrame(data) print(temp_df)
运行这两种方式都会得到你想要的结果:
bc bd cb D1 0 string string [[[123, 123], [123, 123]]] string 1 N/A string [[[123, 123], [123, 123]]] string 2 string N/A [[[123, 123], [123, 123]]] string
内容的提问来源于stack exchange,提问作者Feyzi Bagirov




