为什么pandas无法对列表指定的列执行子集筛选操作
报错信息
ValueError: Unable to coerce to Series, length must be 10: given 2
错误原因
- 维度匹配错误:你直接对10列的DataFrame执行
!= prohibited_symbols操作,pandas无法将长度为2的列表和10列的结构做逐元素对比,触发维度不匹配报错 - 列表定义笔误:
prohibited_symbols = ['?','Nan''n.a']中'Nan'和'n.a'之间遗漏了逗号,两个字符串会被自动拼接为Nann.a,所以你定义的列表实际只有2个元素,刚好对应报错里的given 2 - 索引逻辑错误:即使没有前面的问题,多列布尔矩阵也不能直接用来索引原DataFrame的行,会返回缺失值填充的异常结果
修正代码
如果你要剔除所有包含指定异常值的行,可参考以下实现:
import pandas as pd df = pd.read_csv("/Volumes/SSD/IT/DataSets/Automobile_data.csv") print(df.shape) columns_df = ['index', 'company', 'body-style', 'wheel-base', 'length', 'engine-type', 'num-of-cylinders', 'horsepower', 'average-mileage', 'price'] # 补全逗号,修正异常值列表 prohibited_symbols = ['?','Nan','n.a'] # 取反筛选:保留所有列都没有异常值的行 df = df[~df[columns_df].isin(prohibited_symbols).any(axis=1)] print(df)
逻辑说明
df[columns_df].isin(prohibited_symbols)返回和选中列同维度的布尔矩阵,元素为True代表该位置值属于异常值any(axis=1)逐行判断,只要该行有任意一个元素为True就返回True,代表该行存在异常值~是布尔取反运算符,最终筛选出不存在异常值的行
内容的提问来源于stack exchange,提问作者Ruslan Pylypiuk
相关产品推荐
相关产品推荐

