使用groupby在pandas中的分类变量中删除未使用的类别

时间:2018-01-02 17:01:33

标签: python pandas

根据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

4 个答案:

答案 0 :(得分:6)

选项1
remove_unused_categories

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)