You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

从嵌套字典列表提取元素到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

火山引擎 最新活动