pandas过滤行报IndexingError:布尔序列索引器无法对齐错误
pandas过滤CSV行触发Unalignable boolean Series索引错误
问题场景
执行pandas CSV数据行过滤逻辑时抛出如下错误:IndexingError: Unalignable boolean Series provided as indexer
目标过滤规则:
- 筛选
followersCount字段值在0-1500区间的行 - 移除
bio字段包含list_me变量中指定关键词、特殊字符的行
原始错误代码
import pandas as pd import csv def load_source(filename): users = pd.read_csv(filename, encoding="utf8") return users list_me = "Entrepreneur|Behold|=|Ã|±|Ã|®|Å|¥|ð|Ÿ|˜|‡|ð|à|¤|œ|à|¤|²" users = load_source(latest_file) filtered_followers_up = users[users.followersCount <= 1500] filtered_followers_down = filtered_followers_up[filtered_followers_up.followersCount >= 0] filtered_bio = filtered_followers_down[filtered_followers_down['bio'].dropna().str.contains(list_me)] filtered_bio.to_csv(r'C:\Users\user\Downloads\test.csv', sep=',', encoding='utf-8') print("Done!")
报错截图:
错误原因
报错根源是生成bio字段过滤的布尔掩码时,提前调用了dropna()删除bio为空的行,导致返回的布尔Series索引长度、索引值和待过滤的filtered_followers_down DataFrame不匹配:原DataFrame中bio为NaN的行索引在布尔序列中缺失,pandas无法完成索引对齐,因此抛出索引错误。
另外原始代码逻辑存在偏差:需求是移除包含指定关键词的行,但原逻辑是筛选保留包含关键词的行,和需求相反。
修复方案
不要在生成布尔掩码前提前调用dropna(),直接给str.contains()方法传入na=False参数,将bio为空的行默认判定为「不匹配关键词」,即可保证返回的布尔序列和原DataFrame索引完全对齐;同时对匹配结果取反,即可过滤掉包含指定关键词的行。
另外粉丝数区间筛选可以直接用between()方法简化,无需分两次过滤。
修复后完整代码:
import pandas as pd def load_source(filename): users = pd.read_csv(filename, encoding="utf8") return users list_me = "Entrepreneur|Behold|=|Ã|±|Ã|®|Å|¥|ð|Ÿ|˜|‡|ð|à|¤|œ|à|¤|²" users = load_source(latest_file) # 一步筛选粉丝数在0-1500区间的行 filtered_followers = users[users['followersCount'].between(0, 1500)] # 生成过滤掩码:空值按不匹配处理,取反保留不包含指定关键词的行 bio_mask = ~filtered_followers['bio'].str.contains(list_me, na=False) filtered_bio = filtered_followers[bio_mask] filtered_bio.to_csv(r'C:\Users\user\Downloads\test.csv', sep=',', encoding='utf-8') print("Done!")
内容的提问来源于stack exchange,提问作者Jean Pierre Waked
相关产品推荐
相关产品推荐

