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
相关产品推荐
相关产品推荐

