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

Pandas使用GroupBy.apply时dropna=False仍丢失NaN分组如何解决

问题原因
  • 如果你使用的Pandas版本低于1.1.0:dropna参数是1.1.0版本才新增的groupby配置项,低于该版本时设置不生效,NaN分组会被默认过滤。
  • 版本符合要求仍丢失:当NaN分组的子数据对应分组键列全为NaN时,apply返回子DataFrame的过程中Pandas会触发结果合并的隐式过滤逻辑,导致NaN分组丢失。
可行解决方案

首先确认升级Pandas到1.1.0及以上版本,再选择以下任意一种方法修改代码:

方法1:指定group_keys=False关闭分组键追加逻辑

group_keys默认开启时,Pandas会将分组键作为新的索引层级追加到返回结果中,NaN作为分组键追加时会触发部分版本的自动过滤逻辑,关闭后直接返回原分组的子数据结构即可保留NaN行。

import pandas as pd
import numpy as np

mux = pd.MultiIndex.from_arrays([['a', 'a', np.nan, 'b', 'b'], ['t', 'u', np.nan, 'w', 'y']],
                                names=['level1', 'level2'])
df = pd.DataFrame({'col': [0, np.nan, np.nan, 3, 4]}, mux)

# 追加group_keys=False参数
df = df.groupby(['level2'], dropna=False, group_keys=False).apply(lambda x: x)
print(df)

运行后即可保留level2为NaN的分组行。

方法2:手动重置索引后分组处理再恢复原索引

如果方法1在你的版本中仍不生效,可以用手动控制索引的方式避免隐式过滤:

# 先把索引转为普通列
df_reset = df.reset_index()
# 分组处理后恢复原索引
df = df_reset.groupby(['level2'], dropna=False).apply(lambda x: x).set_index(['level1', 'level2'])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:00:01