我想在使用groupby()
时包含NA
值,这在默认情况下不会发生。我认为选项dropna=False
使其发生。但当列为Categorical
类型时,该选项无效。
我想最好的说法是这背后有一个经过深思熟虑的设计决定。或者它可能与this pandas bug有关,我不完全理解?
我在这里使用的Pandas版本是1.2.5
。
#!/usr/bin/env python3
import pandas as pd
print(pd.__version__) # 1.2.5
# initial data
df = pd.DataFrame(
{
'2019': [1, pd.NA, 0],
'N': [2, 0, 7],
}
)
print(df)
## groupby()'s working as expected
# without NA
res = df.groupby('2019').size()
print(f'\n{res}')
# include NA
res = df.groupby('2019', dropna=False).size()
print(f'\n{res}')
## now the problems
## convert to Category
df['2019'] = df['2019'].astype('category')
# PROBLEM: NA is ignored
res = df.groupby('2019', dropna=False).size()
print(f'\n{res}')
# PROBLEM: NA is ignored even observed has no effect
res = df.groupby('2019', dropna=False, observed=True).size()
print(f'\n{res}')
在输出中,您首先看到初始DataFrame,然后看到两个groupby()输出,它们的行为与预期一致,但最后两个groupby()输出说明了我的问题。
1.2.5
2019 N
0 1 2
1 <NA> 0
2 0 7
2019
0 1
1 1
dtype: int64
2019
0.0 1
1.0 1
NaN 1
dtype: int64
2019
0 1
1 1
dtype: int64
2019
1 1
0 1
dtype: int64
>>>
1条答案
按热度按时间2uluyalo1#
这是一个bug。它是has been fixed,将在Pandas2.0中发布。
最简单的解决方法是暂时撤消类别设置: