如何从df.to_dict生成的嵌套字典中移除NaN值
清理嵌套字典中的NaN值
嘿,我来帮你搞定这个嵌套字典里的NaN清理问题!你用df.to_dict()导出的字典带着不少NaN,其实有两种实用思路,看你想保留嵌套结构还是转成普通扁平字典:
方法一:保留嵌套结构,递归移除NaN
因为你的数据是多层嵌套的字典,我们可以写个递归函数,一层层遍历所有键值对,遇到值为NaN的键直接跳过,碰到子字典就继续深入处理。这里用pd.isna()判断NaN最稳妥,它能识别各种类型的空值(比如numpy的nan、pandas的NaT),不会像原生math.isnan()那样对非数值类型报错。
import pandas as pd def clean_nested_nan(original_dict): cleaned_dict = {} for key, value in original_dict.items(): # 跳过值为NaN的键 if pd.isna(value): continue # 如果是子字典,递归清理 elif isinstance(value, dict): cleaned_subdict = clean_nested_nan(value) # 子字典清理后不为空才保留,避免留空字典 if cleaned_subdict: cleaned_dict[key] = cleaned_subdict # 非NaN且非字典的正常值直接保留 else: cleaned_dict[key] = value return cleaned_dict # 假设你的原始嵌套字典是dic cleaned_nested = clean_nested_nan(dic)
方法二:转成扁平字典,自动过滤NaN
如果你不需要保留嵌套结构,直接从DataFrame生成扁平字典会更省事。df.stack()方法会把多层索引压平,同时自动丢弃NaN值,之后转字典就一步到位了:
# 直接从DataFrame生成无NaN的扁平字典 flat_cleaned = df.stack().to_dict() # 如果你已经有了嵌套字典dic,也可以转成Series再处理 flat_series = pd.Series(dic).stack() flat_cleaned = flat_series.to_dict()
生成的扁平字典键是元组格式(比如('1/13/2018', 0)),对应原嵌套结构的层级关系,所有NaN都已经被过滤掉了。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

