You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用列表推导式移除Pandas多分类列的空白类别(禁用inplace)

问题场景

我们有包含多个分类(category)类型列的DataFrame,示例如下:

import pandas as pd

df = pd.DataFrame(
    data={
        "id": [1, 2, 3, 4],
        "category1": [" ",
                      "data",
                      "more data",
                      "         "],
        "category2": ["   ", "more data", " ", "and more"],
    }
)
df["category1"] = df["category1"].astype("category")
df["category2"] = df["category2"].astype("category")

需求是:移除这些分类列中仅包含空白字符的级别,同时必须保持列的category类型(不能用.str方法处理),且不能使用即将被弃用的inplace参数。

已经用循环实现了需求:

cat_cols = df.select_dtypes("category").columns
for c in cat_cols:
    # 筛选出仅含空白的分类级别
    blank_levels = [level for level in df[c].cat.categories if level.isspace()]
    df[c] = df[c].cat.remove_categories(blank_levels)

但尝试用列表推导式简化时,触发ValueError: Columns must be same length as key错误,错误代码如下:

df[cat_cols] = [df[c].cat.remove_categories(
                [level for level in df[c].cat.categories if level.isspace()])
                for c in cat_cols]
错误原因

直接将列表推导式生成的Series列表赋值给df[cat_cols]时,pandas会默认把列表中的每个Series当作行数据来处理,而非列数据,导致维度不匹配,因此报错。

正确实现方式

只需要把列表推导式的结果转换成DataFrame,就能让pandas正确识别为列数据进行赋值,代码如下:

import pandas as pd

cat_cols = df.select_dtypes("category").columns
df[cat_cols] = pd.DataFrame([
    df[c].cat.remove_categories([level for level in df[c].cat.categories if level.isspace()])
    for c in cat_cols
])
验证结果

执行后可以查看处理后的分类级别,确认空白级别已被移除,且列类型保持category:

print(df["category1"].cat.categories)
# 输出: Index(['data', 'more data'], dtype='object')
print(df["category2"].cat.categories)
# 输出: Index(['and more', 'more data'], dtype='object')
print(df.dtypes)
# id             int64
# category1    category
# category2    category
# dtype: object

内容的提问来源于stack exchange,提问作者Grizzly2501

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 18:33:36