Pandas筛选df1保留breast_exitstat为1/8行运行过慢如何优化
问题原因
你的代码有两个致命问题,这也是运行异常缓慢、结果不符合预期的核心:
- 变量名拼写错误:第二个判断条件里你写的是
df['breast_exitstat'],而非目标对象df1。如果你的运行环境中存在另一个名为df的DataFrame,pandas会先做两个DataFrame列的索引对齐,若两者索引不匹配会生成大量空值,甚至触发隐式的大对象广播,直接把运算速度拖垮。 - 筛选逻辑写反:你当前的取反写法最终会保留所有
breast_exitstat既不等于1也不等于8的行,和你“仅保留取值为1、8的记录”的需求完全相反。
最优实现
7.5万行的行筛选操作正常耗时在毫秒级,用isin()方法做集合匹配,比多条件或运算拼接效率更高、写法更简洁,也不容易写错:
df1 = df1[df1['breast_exitstat'].isin([1, 8])]
如果要明确指定用.loc索引(避免pandas的链式赋值警告),可以写成:
df1 = df1.loc[df1['breast_exitstat'].isin([1, 8]), :]
异常慢的额外排查项
如果修正代码后运行仍然卡顿,优先检查两个点:
- 列类型问题:执行
df1['breast_exitstat'].dtype查看列类型,如果是object类型(说明列里混了字符串、空值、其他类型数据),先转成数值类型再筛选:df1['breast_exitstat'] = pd.to_numeric(df1['breast_exitstat'], errors='coerce') - 内存问题:如果你的运行环境内存占用已经满了,pandas会触发磁盘交换,所有操作的速度会下降几十到上百倍,先释放不用的大对象再执行操作。
不建议用取反+多个等于判断拼接的写法,不仅冗余容易写错,匹配效率也低于原生的
isin()集合判断。
内容的提问来源于stack exchange,提问作者Maya
相关产品推荐
相关产品推荐

