如何用列表推导式移除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
相关产品推荐
相关产品推荐

