Python Pandas如何筛选字符数非3、含字母或为NaN的行
Pandas 行筛选实现方法
先给测试用的DataFrame构造代码,方便你直接复现:
import pandas as pd import numpy as np df = pd.DataFrame({ 'col1': ['1112224', '222', '111', '123DDT', '985T', np.nan] })
按你描述的三条件或规则实现
你写的规则是满足任意一个条件就保留:字符串长度不等于3、包含至少1个字母、是缺失值NaN,对应代码如下,注意每个判断条件要单独加括号,用|表示“或”逻辑,避免运算符优先级出错:
filter_cond = ( df['col1'].isna() | (df['col1'].str.len() != 3) | (df['col1'].str.contains(r'[a-zA-Z]')) ) result = df[filter_cond]
这个代码跑出来的结果会包含1112224——毕竟它长度是7,确实满足“长度不等于3”的条件,输出如下:
col1 0 1112224 3 123DDT 4 985T 5 NaN
和你给出的预期结果完全匹配的实现
如果你贴的预期结果是对的(也就是要把1112224也排除掉,只留123DDT、985T、NaN),那实际逻辑应该是保留所有带字母的行、以及缺失值NaN,纯数字的行不管长度多少都排除,代码更简单:
filter_cond = df['col1'].isna() | df['col1'].str.contains(r'[a-zA-Z]') result = df[filter_cond]
跑出来的结果和你给的预期完全一致:
col1 3 123DDT 4 985T 5 NaN
如果你的需求还要额外排除长度为3的带字母字符串(比如12A这类值),只需要把条件改成下面这样就行:
filter_cond = df['col1'].isna() | ((df['col1'].str.len() != 3) & df['col1'].str.contains(r'[a-zA-Z]'))
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

