在Pandas分类变量上使用groupby删除未使用的类别

nhjlsmyf  于 2023-01-19  发布在  其他
关注(0)|答案(4)|浏览(207)

根据分类数据-操作,默认情况下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

如何获得删除“未使用”类别后的结果?例如

values
cats        
a        1.0
b        2.0
c        4.0
5lwkijsr

5lwkijsr1#

从0.23版本开始,您可以在groupby调用中指定observed=True以实现所需的行为。

dbf7pr2w

dbf7pr2w2#

    • 备选案文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()

或者,
一个二个一个一个

    • 备选案文2**

astypestr的转换-

df.groupby(df['cats'].astype(str)).mean()

      values
cats        
a          1
b          2
c          4
sqougxex

sqougxex3#

就像这样链接dropna

df.groupby("cats").mean().dropna()

      values
cats
a        1.0
b        2.0
c        4.0
kwvwclae

kwvwclae4#

如果要从所有分类列中删除未使用的分类,可以:

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)

相关问题