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

使用convert_df合并嵌套字典生成DataFrame时遇AttributeError错误

解决AttributeError: 'tuple' object has no attribute 'values'并合并嵌套字典为DataFrame

错误原因

  • 你调用convert_df([df,df1])时,把两个字典打包成一个列表传入,而函数里的*dic参数会把这个列表当成单个元素,导致dic变成([df,df1],)这样的元组。pd.DataFrame.from_dict无法处理元组,因此抛出tuple没有values属性的错误。
  • 就算参数传对,直接给from_dict传入多个字典也不会自动合并成目标格式,需要先合并字典内容,或分别转成DataFrame后再合并。

方案1:合并嵌套字典后转DataFrame

先按索引合并两个字典的子字典,再整体转换为DataFrame,适合已知字典索引完全匹配的场景:

import pandas as pd

df = {1 : {'tp': 26, 'fp': 112},
2 : {'tp': 26, 'fp': 91},
3 : {'tp': 23, 'fp': 74}}

df1 = {1 : {'tp1': 2633, 'fp1': 34},
2 : {'tp1': 333, 'fp1': 9341},
3 : {'tp1': 335, 'fp1': 34}}

def convert_df(dic1, dic2):
    # 按索引合并两个字典的子字典
    merged_dict = {key: {**dic1[key], **dic2[key]} for key in dic1}
    return pd.DataFrame.from_dict(merged_dict, orient='index')

# 直接传入两个字典,无需打包成列表
result_df = convert_df(df, df1)
print(result_df)

输出结果:

tp   fp   tp1   fp1
1  26  112  2633    34
2  26   91   333  9341
3  23   74   335    34

方案2:分别转DataFrame后合并

先将每个字典转为DataFrame,再用pd.concat按索引横向合并,支持传入多个字典,灵活性更高:

import pandas as pd

df = {1 : {'tp': 26, 'fp': 112},
2 : {'tp': 26, 'fp': 91},
3 : {'tp': 23, 'fp': 74}}

df1 = {1 : {'tp1': 2633, 'fp1': 34},
2 : {'tp1': 333, 'fp1': 9341},
3 : {'tp1': 335, 'fp1': 34}}

def convert_df(*dics):
    # 将每个字典转为DataFrame并存入列表
    df_list = [pd.DataFrame.from_dict(dic, orient='index') for dic in dics]
    # 按索引横向合并所有DataFrame
    return pd.concat(df_list, axis=1)

# 直接传入任意数量的字典作为参数
result_df = convert_df(df, df1)
print(result_df)

输出结果与方案1一致。

内容的提问来源于stack exchange,提问作者Sushil Kokil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:50:37