如何组合两个筛选条件?DataFrame筛选触发内存错误求助
问题:组合DataFrame筛选条件时触发内存错误
问题详情
原始DataFrame示例
EXCLUDE WARNSIGN_DTL EVENT_DTL EVENT_DTL_2 1_1 The thing happened on 2021... according to this, this people did bla bla on 2021... It happened on 2021.... 1_2 similar thing happened on 2012... that was happened on 2012... ... 1_1 Sam did on 2012... that was happened on 2012... it hasn't made sense till 2012...
用户代码
df_check = df[['EXCLUDE','WARNSIGN_DTL','EVENT_DTL','EVENT_DTL_2']] df_check.EXCLUDE!=1_1 & df_check.apply(lambda x: x.str.contains('2021|2012', na=False))
报错信息
--------------------------------------------------------------------------- MemoryError: Unable to allocate 82.1 GiB for an array with shape (104959, 104959) and data type float64
需求
如何正确将「EXCLUDE不等于1_1」和「任意文本列包含2021或2012」两个筛选条件组合使用?
解决方案
错误原因
- 语法优先级与字符串未加引号:
!=优先级低于&,且1_1未加引号会被识别为变量(实际应为字符串'1_1'),导致逻辑判断混乱。 - 广播导致内存溢出:
apply返回布尔型DataFrame,直接和EXCLUDE列的布尔Series做&运算时,会触发广播生成巨大二维数组,超出内存限制。
正确实现方式
方法一:用apply+any(axis=1)
# 筛选条件1:EXCLUDE不等于'1_1' cond1 = df_check['EXCLUDE'] != '1_1' # 筛选条件2:任意文本列包含'2021'或'2012' cond2 = df_check[['WARNSIGN_DTL', 'EVENT_DTL', 'EVENT_DTL_2']].apply( lambda x: x.str.contains('2021|2012', na=False) ).any(axis=1) # 组合条件筛选结果 result = df_check[cond1 & cond2]
方法二:向量化操作(更高效)
避免apply,直接用向量化的str.contains组合条件:
import numpy as np # 分别检查每一列是否包含目标字符串 warn_check = df_check['WARNSIGN_DTL'].str.contains('2021|2012', na=False) event_check = df_check['EVENT_DTL'].str.contains('2021|2012', na=False) event2_check = df_check['EVENT_DTL_2'].str.contains('2021|2012', na=False) # 条件2:任意一列满足即返回True cond2 = np.logical_or.reduce([warn_check, event_check, event2_check]) # 组合条件筛选 result = df_check[(df_check['EXCLUDE'] != '1_1') & cond2]
内容的提问来源于stack exchange,提问作者Joshua Chung
相关产品推荐
相关产品推荐

