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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:12:26