Pandas循环批量删除行后DataFrame行数异常原因咨询
问题原因分析
核心问题是DataFrame存在重复索引,导致删除操作意外删除了大量额外行:
- 你用
deal.loc[deal.customer_id.isin(cust_ids)]筛选出了53行,但这些行的索引值在原deal里不是唯一的。 - 当执行
deal.drop(filters.index, inplace=True)时,Pandas的drop方法是针对索引值操作的——只要行的索引和filters里的索引值匹配,就会被删除,而不是只删除filters里的那53行。这就导致实际删除的行数远多于预期,直接让deal的行数从7436跳到6294。
另外你提到的代码逻辑错误也需要注意:循环里的deal.customer_id.unique()是在循环启动前一次性计算的,也就是初始的所有唯一客户ID列表。但随着循环不断删除行,后续批次的客户ID可能已经在deal里没有对应数据了,这会做无用功,但不是这次行数异常的直接原因。
验证方法
- 检查索引是否重复:执行
print(deal.index.is_unique),如果返回False就坐实了这个问题。 - 查看实际删除的行数:运行
deal.index.value_counts().loc[filters.index].sum(),结果应该等于7436 - 6294 = 1142。
修复方案
- 重置为唯一索引:处理前执行
deal = deal.reset_index(drop=True),确保每行索引唯一。 - 改用布尔掩码删除:避免依赖索引,直接用
deal = deal[~deal.customer_id.isin(cust_ids)](不推荐用inplace=True,重新赋值更安全)。
内容的提问来源于stack exchange,提问作者wedrano de carvalho
相关产品推荐
相关产品推荐

