根据Categorical Data - Operations,默认情况下groupby
会显示“未使用”类别:
In [118]: cats = pd.Categorical(["a","b","b","b","c","c","c"], categories=["a","b","c","d"])
In [119]: df = pd.DataFrame({"cats":cats,"values":[1,2,2,2,3,4,5]})
In [120]: df.groupby("cats").mean()
Out[120]:
values
cats
a 1.0
b 2.0
c 4.0
d NaN
如何获取“未使用”类别的结果? e.g。
values
cats
a 1.0
b 2.0
c 4.0
答案 0 :(得分:6)
df.groupby(df.cats.cat.remove_unused_categories()).mean()
values
cats
a 1
b 2
c 4
您也可以先进行分配,然后groupby
-
df.assign(cats=df.cats.cat.remove_unused_categories()).groupby('cats').mean()
或者,
df['cats'] = df.cats.cat.remove_unused_categories()
df.groupby('cats').mean()
values
cats
a 1
b 2
c 4
选项2
astype
转换为str
-
df.groupby(df.cats.astype(str)).mean()
values
cats
a 1
b 2
c 4
答案 1 :(得分:2)
只需与dropna
链接。像这样:
df.groupby("cats").mean().dropna()
values
cats
a 1.0
b 2.0
c 4.0
答案 2 :(得分:1)
从0.23版开始,您可以在observed=True
调用中指定groupby
,以实现所需的行为。
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.groupby.html
答案 3 :(得分:0)
如果要从所有类别列中删除未使用的类别,则可以:
def remove_unused_categories(df: pd.DataFrame):
for c in df.columns:
if pd.api.types.is_categorical_dtype(df[c]):
df[c].cat.remove_unused_categories(inplace=True)
然后在致电groupby
之前,致电:
remove_unused_categories(df_with_empty_cat)