如何删除以EFF开头列存在值的DataFrame记录?
解决Pandas过滤所有'EFF'开头列无值记录的问题
问题背景
你已经合并了evt_df和eff_df两个DataFrame,现在需要删除所有存在任意一个'EFF'开头列有值的记录,保留那些所有'EFF'列都为空的行。但你尝试的代码把所有记录都过滤掉了,得到了8 0的结果。
原始数据示例:
EVT_ID EVT_STATUS EVT_VALIDFROM EFF_ID EFF_STATUS EFF_VALIDFROM ORLE-20210205 VAL 19.02.2021 12:48 ORLE-20210205 VAL 28.03.2021 12:54 ORLE-20210205 VAL 19.02.2021 12:48 ORLE-20210205 VAL 28.03.2021 12:54 ORLE-20210305 VAL 17.03.2021 15:12 ORLE-20210305 VAL 30.03.2021 09:48 ORLE-20210305 VAL 17.03.2021 15:12 ORLE-20200304 VAL 05.03.2020 18:36 ORLE-20200304 VAL 05.03.2020 18:36 ORLE-20190930 VAL 01.10.2019 12:04 ORLE-20200304 VAL 05.03.2020 18:36
期望结果:
EVT_ID EVT_STATUS EVT_VALIDFROM EFF_ID EFF_STATUS EFF_VALIDFROM ORLE-20210305 VAL 17.03.2021 15:12 ORLE-20200304 VAL 05.03.2020 18:36 ORLE-20200304 VAL 05.03.2020 18:36 ORLE-20190930 VAL 01.10.2019 12:04 ORLE-20200304 VAL 05.03.2020 18:36
原代码问题分析
你的代码有两个关键问题:
- 空值判断错误:从Excel读取的空单元格在Pandas中默认是
NaN,而不是空字符串'',所以df.filter(regex='EFF', axis=1) == ''无法匹配这些真实的空值,导致筛选条件失效。 - 逻辑方向错误:
any(1)表示「只要任意一列满足条件就保留该行」,但你需要的是「所有'EFF'列都为空才保留」,应该用all(1)(所有列都满足条件)。
正确解决方案
修改筛选逻辑,针对NaN进行判断,并使用正确的逻辑运算符:
import pandas as pd # 读取数据 df = pd.read_excel('C:/Users/PI33588/Desktop/eff_month_all.xlsx') print(f"原始记录数: {len(df.index)}") # 筛选所有'EFF'开头的列都为空的行 eff_columns = df.filter(regex='^EFF') # 匹配以EFF开头的列 df_filtered = df[eff_columns.isna().all(axis=1)] print(f"过滤后记录数: {len(df_filtered.index)}") print(df_filtered)
代码解释
df.filter(regex='^EFF'):精准匹配所有以EFF开头的列(^正则符号表示开头),避免误匹配包含EFF但不在开头的列。eff_columns.isna():判断这些列的每个单元格是否为NaN(空值),返回一个布尔值的DataFrame。.all(axis=1):按行判断,只有当该行所有'EFF'列都是NaN时,返回True,这样的行才会被保留。
执行这段代码后,就能得到你期望的结果,保留那些所有'EFF'列都为空的记录。
内容的提问来源于stack exchange,提问作者datasciencebegginer
相关产品推荐
相关产品推荐

