使用单元素元组作为键的嵌套字典创建Pandas DataFrame时出现NaN问题
关于嵌套字典创建Pandas DataFrame时单元素元组键导致NaN的问题
这确实是个挺让人困惑的现象,在你使用的Pandas 0.19.2版本里,处理单元素元组作为嵌套字典内层键时,确实存在这样的逻辑bug。
问题原因分析
Pandas在通过嵌套字典构建DataFrame时,会尝试自动推断行/列索引:
- 当内层字典的键是多元素元组时,Pandas会识别出这是多级行索引(MultiIndex),外层字典的键(0-5)作为列名,每个列对应的字典值能正确匹配到多级索引的行上,所以显示正常。
- 但当内层字典的键是单元素元组时,老版本的Pandas会错误地把这个单元素元组当成普通的行索引标签,但在映射值的时候,没有正确将字典里的单元素元组键与行索引匹配,导致所有单元格都填充为NaN。这个问题在后续的Pandas版本(比如0.20及以上)中已经被修复了。
解决方案
有两种方式可以解决这个问题:
1. 升级Pandas版本
如果项目允许,直接升级到较新的Pandas版本(比如1.x系列),升级后再运行你的代码,单元素元组的情况就能正常生成DataFrame,输出会和多元素元组的情况一致。
2. 手动处理字典(适用于无法升级的场景)
你可以提前转换内层字典的键,把单元素元组拆解成单个值,再构建DataFrame:
import pandas as pd dict1 = { 0: {('kfield',): 100.0}, 1: {('kfield',): 101.0}, 2: {('kfield',): 102.5}, 3: {('kfield',): 103.5}, 4: {('kfield',): 104.5}, 5: {('kfield',): 105.5} } # 转换内层字典的键,将单元素元组转为单个值 dict1_fixed = {} for col, inner_dict in dict1.items(): for tuple_key, val in inner_dict.items(): # 取出元组的唯一元素作为新键 new_key = tuple_key[0] dict1_fixed[col] = {new_key: val} df = pd.DataFrame(dict1_fixed) print(df)
执行后输出:
0 1 2 3 4 5 kfield 100.0 101.0 102.5 103.5 104.5 105.5
或者你也可以显式指定多级索引,再逐个填充值:
import pandas as pd dict1 = { 0: {('kfield',): 100.0}, 1: {('kfield',): 101.0}, 2: {('kfield',): 102.5}, 3: {('kfield',): 103.5}, 4: {('kfield',): 104.5}, 5: {('kfield',): 105.5} } # 创建多级行索引 index = pd.MultiIndex.from_tuples([('kfield',)]) df = pd.DataFrame(index=index) # 逐个列填充值 for col, val_dict in dict1.items(): df[col] = list(val_dict.values()) print(df)
这个方法也能得到正确的结果。
内容的提问来源于stack exchange,提问作者BBC
相关产品推荐
相关产品推荐

