如何在Pandas数据框中筛选指定列均不含Y的剩余行?
问题原因及解决方法
你的代码确实引发了内存问题,根源是语法错误:
在(df[df['column3'] != 'Y'])和(df[df['column4'] != 'Y'])这两处,你多嵌套了一层df[]。正确写法应该和前两列一致,直接用df['column3'] != 'Y'——这会返回一个与原DataFrame行数匹配的布尔序列,用于过滤行。
而错误写法返回的是整个子DataFrame,当它和前面的布尔序列做&运算时,pandas会触发广播机制,试图将布尔序列与DataFrame的每一列做运算,生成一个形状为(1855862, 1724897)的超大数组,这就是为什么会出现需要23.3TiB内存的离谱需求。
正确代码写法
写法一(修正语法错误)
none_of_the_things = df[(df['column1'] != 'Y') & (df['column2'] != 'Y') & (df['column3'] != 'Y') & (df['column4'] != 'Y')]
写法二(更简洁高效)
用eq判断是否等于Y,any(axis=1)检查每行是否存在至少一个Y,取反后就是所有列都不含Y的行:
none_of_the_things = df[~df[['column1', 'column2', 'column3', 'column4']].eq('Y').any(axis=1)]
内容的提问来源于stack exchange,提问作者thoth
相关产品推荐
相关产品推荐

