You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何组合两个筛选条件?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_1'),导致逻辑判断混乱。
  2. 广播导致内存溢出: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 07:00:58