使用mask筛选value_counts()>20的DataFrame行时出现索引不匹配报错
解决Pandas中"Unalignable boolean Series"报错问题
兄弟,我一眼就看出问题出在哪了——你用df['name'].value_counts() > 20生成的布尔Series,它的索引是name列的唯一值,而不是原DataFrame的行索引,这俩压根对不上,Pandas自然会报错说无法对齐啦!
问题根源拆解
当你执行df['name'].value_counts()时,返回的结果是一个以name列的不同取值为索引、对应出现次数为值的Series。你给它加了>20的判断后,得到的mask依然保留着这些name值作为索引。但原DataFramedf的索引是行号(或你自定义的行索引),两者的索引完全不匹配,Pandas没办法把mask的布尔值和df的行对应起来,所以就抛出了这个对齐错误。
正确解法
这里给你两种靠谱的解决方式,按需选择:
方法1:用isin()先拿符合条件的name值
# 第一步:筛选出出现次数大于20的name值 popular_names = df['name'].value_counts()[df['name'].value_counts() > 20].index # 第二步:过滤原DataFrame中name在上述列表里的行 NewDf = df[df['name'].isin(popular_names)]
这种方式逻辑清晰,先把符合条件的name值提取出来,再用isin()判断每行的name是否在这个集合里,生成的布尔Series和原df的索引完全一致,完美对齐。
方法2:用transform()一行搞定(更优雅)
NewDf = df[df.groupby('name')['name'].transform('count') > 20]
groupby('name')之后调用transform('count'),会给原df的每一行返回对应name的总出现次数,生成的Series长度和索引都和原df完全匹配,直接就能用来筛选,一行代码搞定更简洁。
小提示
以后用布尔索引筛选DataFrame时,一定要注意布尔Series的索引和目标DataFrame的索引是否一致,这是Pandas新手很容易踩的坑哦!
内容的提问来源于stack exchange,提问作者Dcook
相关产品推荐
相关产品推荐

