Pandas填充指定分类列空值时触发ValueError:Columns must be same length as key
解决DataFrame填充分类列空值时的"Columns must be same length as key"错误
尝试用字符串填充DataFrame中分类列的空值时触发了错误,相关代码和错误信息如下:
相关代码
# 指定存在合法空值的列 legit_na_values_columns = ["MasVnrArea", "MasVnrType", "BsmtExposure", "BsmtCond", "BsmtFinType1", "BsmtFinType2", "BsmtQual", "BsmtQual", "GarageCond", "GarageQual", "GarageFinish", "GarageType", "Fireplaces", "Fence", "Alley", "MiscFeature", "PoolQC"] num_legit_na = [i for i in df[legit_na_values_columns].columns if df[i].dtype in ["int", "float"]] cat_legit_na = [i for i in df[legit_na_values_columns].columns if df[i].dtype=="object"] df_handled = df.copy() df_handled[cat_legit_na] = df_handled[cat_legit_na].fillna("not_exist")
错误信息
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-9-f772f77eee32> in <module> 1 # 用"not_exist"填充存在合法空值的分类列 ----> 2 df_handled[cat_legit_na] = df_handled[cat_legit_na].fillna("None") 3 frames /usr/local/lib/python3.7/dist-packages/pandas/core/frame.py in _set_item_frame_value(self, key, value) 3727 len_cols = 1 if is_scalar(cols) else len(cols) 3728 if len_cols != len(value.columns): -> 3729 raise ValueError("Columns must be same length as key") 3730 3731 # 对齐右侧列与自身列 ValueError: 列长度必须与键匹配
问题原因
legit_na_values_columns列表中**"BsmtQual"被重复写了两次**。用这个列表索引DataFrame时,会生成包含重复列的临时DataFrame,后续提取的cat_legit_na也会包含重复列名。
赋值时,左边df_handled[cat_legit_na]指向原DataFrame的无重复列,而右边df_handled[cat_legit_na].fillna(...)返回的是带重复列的DataFrame,两边列数不匹配,因此触发错误。
解决方案
只需要对legit_na_values_columns去重,再执行后续步骤即可:
方法1:保留原列顺序去重
# 指定存在合法空值的列并去重(保留原顺序) legit_na_values_columns = list(dict.fromkeys(["MasVnrArea", "MasVnrType", "BsmtExposure", "BsmtCond", "BsmtFinType1", "BsmtFinType2", "BsmtQual", "BsmtQual", "GarageCond", "GarageQual", "GarageFinish", "GarageType", "Fireplaces", "Fence", "Alley", "MiscFeature", "PoolQC"])) # 划分数值列和分类列 num_legit_na = [i for i in df[legit_na_values_columns].columns if df[i].dtype in ["int", "float"]] cat_legit_na = [i for i in df[legit_na_values_columns].columns if df[i].dtype=="object"] # 复制DataFrame并填充空值 df_handled = df.copy() df_handled[cat_legit_na] = df_handled[cat_legit_na].fillna("not_exist")
方法2:不保留顺序去重(更简洁)
如果不需要保留原列的顺序,可以用集合去重:
legit_na_values_columns = list(set(["MasVnrArea", "MasVnrType", "BsmtExposure", "BsmtCond", "BsmtFinType1", "BsmtFinType2", "BsmtQual", "BsmtQual", "GarageCond", "GarageQual", "GarageFinish", "GarageType", "Fireplaces", "Fence", "Alley", "MiscFeature", "PoolQC"])) # 后续代码同上
内容的提问来源于stack exchange,提问作者Romstormy27
相关产品推荐
相关产品推荐

