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

Pandas如何拆分DataFrame并保留条件匹配/不匹配子集

pandas按条件拆分DataFrame实现方案

从csv导入生成pandas DataFrame后,常需要按条件筛选删除行。由于待删除行数通常较少,直接核查被删除的行来验证筛选逻辑准确性,比逐行检查留存行效率更高。

传统写法需要同时编写原筛选条件、条件取反两套逻辑,类似:

dfcd=df.loc[(~df.Course_Code.str.contains('MG')) & (~df.Course_Code.str.contains('DE'))]
df=df.loc[(df.Course_Code.str.contains('MG')) | (df.Course_Code.str.contains('DE'))]

这种写法冗余度高,当筛选条件复杂度提升时,很容易在取反逻辑上写错。即使通过将~移到括号外简化取反写法,依然需要维护两套条件,不够便捷。理想的实现是一次调用就返回两个DataFrame,分别存储条件匹配、不匹配的行,调用形式类似:

df,dfcd=df.<command>(筛选条件)

具体实现方案

1. 预存布尔掩码(零依赖通用方案)

不需要找特殊内置命令,只需要把筛选条件的布尔结果提前存为变量,全程只需要写一次筛选逻辑,从根源上避免两边条件不一致的问题:

# 仅需编写一次筛选条件,存为布尔掩码
# 多关键词包含匹配直接用正则|拼接,不需要重复写多次str.contains
mask = df.Course_Code.str.contains('MG|DE', na=False)
# 匹配条件的留存数据集
df = df[mask]
# 不匹配条件的待核查/删除数据集
dfcd = df[~mask]

提示:给str.contains传入na=False可以把列中的空值统一判定为不匹配,避免空值导致索引报错。

2. 封装通用拆分函数(贴合预期调用形式)

如果经常需要做这类拆分,可以封装一个极简的工具函数,完全实现一行赋值拆分的效果:

def df_split(df, bool_mask):
    """按布尔条件拆分DataFrame,返回(匹配行, 不匹配行)"""
    return df[bool_mask].copy(), df[~bool_mask].copy()

# 调用形式和预期写法完全一致
df, dfcd = df_split(df, df.Course_Code.str.contains('MG|DE', na=False))

函数里加.copy()是为了避免后续修改拆分后的子集时触发SettingWithCopyWarning,如果不需要修改拆分后的数据可以去掉。

额外优化技巧

如果筛选条件是列值精确匹配(不是模糊包含匹配),可以直接用isin方法写条件,比多个或判断更简洁:

# 比如需要筛选Course_Code刚好等于MG101、DE202的行
mask = df.Course_Code.isin(['MG101', 'DE202'])

内容的提问来源于stack exchange,提问作者ic198

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 03:39:42