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

Pandas分组后NaN转回问题:如何全转None生成合法JSON

Pandas GroupBy后None变回NaN的解决方法

问题原因

Pandas的聚合函数(如sum/max/mean)处理包含None的Series时,会自动将None转换为对应数据类型的缺失标记NaN——因为数值、时间序列等类型无法存储None,只能用NaN表示缺失。这就导致你之前转成None的值在分组聚合后又变回NaN,最终JSON输出同时存在null和NaN。

解决方案

下面提供两种实用的解决思路,根据你的场景选择:

方案1:自定义聚合函数,提前保留None

编写一个包装函数,先过滤掉缺失值,再执行聚合逻辑;如果过滤后无有效数据,直接返回None,避免生成NaN:

import pandas as pd
import json

def safe_agg(func):
    def wrapper(series):
        filtered = series.dropna()
        return func(filtered) if not filtered.empty else None
    return wrapper

# 模拟数据合并流程
data1 = [{"id": 1, "name": "A", "value": None}, {"id": 2, "name": "B", "value": 10}]
data2 = [{"id": 1, "name": "A", "score": None}, {"id": 3, "name": "C", "score": 20}]

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
merged_df = pd.merge(df1, df2, on=["id", "name"], how="outer")
merged_df = merged_df.where(pd.notna(merged_df), None)

# 使用自定义聚合函数分组
grouped = merged_df.groupby("name").agg(
    value=("value", safe_agg(sum)),
    score=("score", safe_agg(max))
).reset_index()

# 转JSON
result = json.dumps(grouped.to_dict("records"))
print(result)

方案2:分组后统一转换所有NaN为None

如果不想修改聚合逻辑,可以在分组操作完成后,对整个DataFrame做一次全局替换,把所有NaN转成None:

import pandas as pd
import json

# 数据合并流程同上
data1 = [{"id": 1, "name": "A", "value": None}, {"id": 2, "name": "B", "value": 10}]
data2 = [{"id": 1, "name": "A", "score": None}, {"id": 3, "name": "C", "score": 20}]

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
merged_df = pd.merge(df1, df2, on=["id", "name"], how="outer")
merged_df = merged_df.where(pd.notna(merged_df), None)

# 常规分组聚合
grouped = merged_df.groupby("name").agg({"value": "sum", "score": "max"}).reset_index()

# 全局替换NaN为None
grouped = grouped.applymap(lambda x: None if pd.isna(x) else x)

# 转JSON
result = json.dumps(grouped.to_dict("records"))
print(result)

关键注意点

  • 对于字符串类型的字段,使用first/last等聚合方法时可能不会生成NaN,但数值、时间类型字段必须处理;
  • applymap会遍历DataFrame的每个元素,适合全局替换;where方法也可以实现同样效果:grouped = grouped.where(pd.notna(grouped), None);
  • 最终转JSON时,Pandas的to_dict会自动把None转为JSON的null,而NaN不会,所以必须确保所有缺失值都是None。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 00:45:14