使用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
相关产品推荐
相关产品推荐

