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

