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

Pandas分组聚合后缺失值表示不一致问题咨询

Pandas分组聚合中全缺失值列的缺失值表示差异问题

问题场景复现

对分组后的Pandas DataFrame执行聚合操作时,全缺失值列的聚合输出会因列类型不同呈现不同的缺失值表示。以下是最简示例,每个DataFrame的a列分别包含一个非缺失值(整数、字符串、元组)、一个NaN和一个None:

import pandas as pd
import numpy as np

a1 = pd.DataFrame({'a': [3, np.nan, None], 'b': [0,1,2]})
a2 = pd.DataFrame({'a': ['tree', np.nan, None], 'b': [0,1,2]})
a3 = pd.DataFrame({'a': [(0,1,2), np.nan, None], 'b': [0,1,2]})

# 两种聚合方式结果一致
a1.groupby('b')['a'].first()
a2.groupby('b')['a'].first()
a3.groupby('b')['a'].first()

a1.groupby('b')['a'].agg('first')
a2.groupby('b')['a'].agg('first')
a3.groupby('b')['a'].agg('first')

列类型说明

查看a列的dtypes可知:

  • a1的a列类型:float64(创建时None已自动转换为NaN)
  • a2的a列类型:object
  • a3的a列类型:object

预期与实际输出

预期输出行为

  • a1:第1、2行返回NaN(符合预期)
  • a2:第1行返回NaN,第2行返回None(不符合预期)
  • a3:第1行返回NaN,第2行返回None(不符合预期)

实际输出结果

# a1聚合结果
b
0    3.0
1    NaN
2    NaN
Name: a, dtype: float64

# a2聚合结果
b
0    tree
1    None
2    None
Name: a, dtype: object

# a3聚合结果
b
0    (0, 1, 2)
1         None
2         None
Name: a, dtype: object

核心疑问

为何a2和a3的第1行在聚合后从NaN变为None?由于列类型为object,理论上可以分别返回NaN和None,且当前场景中没有分组同时包含NaN和None的情况。官方文档对此行为描述也不够明确,仅提及全NA列返回NA。

补充更新

正如@mozway的回答所述,对于纯NaN/None分组,可使用skipna=False来分别保留NaN和None。但该方法在同时存在混合非缺失/缺失值列和全缺失值列的场景(如[[np.nan, None, 'tree'],[np.nan, None]])中不适用,因为此时需要skipna=True来获取第一个非缺失值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:56:09