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
相关产品推荐
相关产品推荐

