如何修复Pandas中DataFrame年份列非标准行删除失效问题?
解决DataFrame删除含非年份格式行的问题
你的代码有两个核心问题:
- 正则表达式里的
.是通配符,会匹配任意字符,所以contains(".")实际会匹配所有字符串,取反后逻辑完全错误,必须转义成\.才能匹配真实的小数点。 - 布尔运算逻辑搞反了:
(~A)|(~B)等价于只要不同时包含小数点和横杠的行都保留,这和你要删除含小数点或横杠的需求完全相反,应该用~(A|B)或者(~A)&(~B)。
下面是几种可行的修正方案:
方案一:修正正则与逻辑运算
df['level_1'] = df['level_1'].astype(str) # 筛选出既不含小数点也不含横杠的行 filtered_df = df.loc[ ~(df['level_1'].str.contains(r"\.") | df['level_1'].str.contains("-")), : ]
方案二:用单个正则简化匹配
把小数点和横杠合并到一个正则表达式里,代码更简洁:
df['level_1'] = df['level_1'].astype(str) # 匹配包含.或-的字符串,取反后保留目标行 filtered_df = df.loc[~df['level_1'].str.contains(r"[\.-]"), :]
方案三:精准匹配四位数字年份
如果你的年份是标准四位数字(比如2023、1998),直接匹配四位数字更精准,能排除其他非年份的纯数字(比如123、20234):
df['level_1'] = df['level_1'].astype(str) # 只保留完全是四位数字的行 filtered_df = df.loc[df['level_1'].str.fullmatch(r"\d{4}"), :]
内容的提问来源于stack exchange,提问作者Aroune
相关产品推荐
相关产品推荐

