如何让Pandas groupbyFlatCount函数保留类型信息且不丢失数据?
解决Pandas groupby分组int64列数据丢失问题
修改后的函数
def groupbyFlatCount(frame, by): return frame.groupby(by=by, dropna=False).size().reset_index().rename(columns={0:'count'})
问题原因
Pandas groupby 默认参数 dropna=True,会丢弃分组键为缺失值(NaN/NA)的行。当你将int64列转为object类型时,缺失值会被当作一个有效的分组键保留,因此不会丢失数据;而默认的int64(或nullable Int64)列分组时,缺失值会被过滤,导致数据丢失。
验证示例
import pandas as pd import numpy as np # 创建包含缺失值的测试DataFrame df = pd.DataFrame({ 'int_col': pd.Series([1, 2, 2, np.nan], dtype='Int64'), # nullable int64类型 'float_col': [1.1, 2.2, 2.2, 3.3], 'obj_col': ['a', 'b', 'b', None] }) # 原函数调用(丢失缺失值分组) print("原函数结果:") print(groupbyFlatCount(df, 'int_col')) # 仅显示1、2两个分组 # 修改后函数调用(保留所有分组) print("\n修改后函数结果:") print(groupbyFlatCount(df, 'int_col')) # 包含<NA>分组,且int_col类型仍为Int64
额外说明
- 该修改不会改变原分组列的数据类型,会完整保留int64/Int64、float64、object等类型信息。
- 如果你的int64列是普通非nullable类型(无法存储NaN,遇到NaN会自动转为float64),建议先转为nullable Int64类型(
frame[by] = frame[by].astype('Int64')),再使用修改后的函数,确保缺失值被正确识别和保留。
内容的提问来源于stack exchange,提问作者Isaacnfairplay
相关产品推荐
相关产品推荐

