过滤“pandas”中所有不包含字母(alpha)的行

Posted

技术标签:

【中文标题】过滤“pandas”中所有不包含字母(alpha)的行【英文标题】:Filter all rows that do not contain letters (alpha) in ´pandas´ 【发布时间】:2018-10-12 13:35:12 【问题描述】:

我正在尝试使用 regular expressions 过滤 pandas 数据帧。 我想删除那些不包含任何字母的行。例如:

Col A.
50000
$927848
dog
cat 583
rabbit 444

我想要的结果是:

Col A.
dog
cat 583
rabbit 444

我一直在尝试使用regexpandas 过滤器选项来解决这个问题,但没有成功。见吹。当我尝试合并过滤器的两个条件时,我特别遇到了问题。我怎样才能做到这一点?

选项 1:

df['Col A.'] = ~df['Col A.'].filter(regex='\d+')

选项 2

df['Col A.'] = df['Col A.'].filter(regex=\w+)

选项 3

from string import digits, letters
df['Col A.'] = (df['Col A.'].filter(regex='|'.join(letters)))

df['Col A.'] = ~(df['Col A.'].filter(regex='|'.join(digits)))

df['Col A.'] = df[~(df['Col A.'].filter(regex='|'.join(digits))) & (df['Col A.'].filter(regex='|'.join(letters)))]

【问题讨论】:

是否需要正则表达式? @jpp 不需要正则表达式。只是我到目前为止所遵循的方法 【参考方案1】:

我认为您需要str.contains 通过boolean indexing 过滤包含字母的值:

df =  df[df['Col A.'].str.contains('[A-Za-z]')]
print (df)
       Col A.
2         dog
3     cat 583
4  rabbit 444

如果有一些NaNs 值,你可以传递一个参数:

df = df[df['Col A.'].str.contains('[A-Za-z]', na=False)]    
print (df)
       Col A.
3         dog
4     cat 583
5  rabbit 444

【讨论】:

对我来说,这个解决方案是删除所有不是字母的东西。它剥离了我拥有的混合字符的实例 如果转换为str 有帮助吗? df[df['Col A.'].astype(str).str.contains('[A-Za-z]')] ? 并且不需要包含至少一个字母的过滤器值?不等于去掉所有不是字母的吗? 这是一种清理,我需要过滤掉那些行中没有至少 1 个字母的实例。 嗯,所以我的解决方案失败了?我认为它应该很好用。【参考方案2】:

你试过了吗:

df['Col A.'].filter(regex=r'\D')  # Keeps only if there's a non-digit character

或:

df['Col A.'].filter(regex=r'[A-Za-z]')  # Keeps only if there's a letter (alpha)

或:

df['Col A.'].filter(regex=r'[^\W\d_]')  # More info in the link below...

解释:https://***.com/a/2039476/8933502

【讨论】:

【参考方案3】:

df['Col A.'].str.contains(r'^\d+$', na=True) # 如果字符串只有数字或者如果是 int/float 那么将导致 NaN 转换为 True

例如:[50000, '$927848', 'dog', 'cat 583', 'rabbit 444', '3 e 3', 'e 3', '33', '3 e'] 会给 : [真、假、假、假、假、假、假、真、假]

【讨论】:

【参考方案4】:

你可以使用^.*[a-zA-Z].*$

https://regex101.com/r/b84ji1/1

详情

^:行首

.*: 匹配任意字符

[a-zA-Z]: 匹配字母

$: 行尾

【讨论】:

由于某些行是字母和数字的组合,这种方法实际上过滤了我所有的数据。我只是想删除那些不包含至少 1 个字母的行 这适用于您的测试用例。它只保留至少包含一个字母的字符串。我不明白你怎么了?

以上是关于过滤“pandas”中所有不包含字母(alpha)的行的主要内容,如果未能解决你的问题,请参考以下文章

ctype_alpha() 是检查字符串是不是仅包含字母的更好方法吗

Pandas 过滤多个串联子串

week03

在pyspark中删除所有包含一个字母的行[重复]

如何从 Pandas 数据框中过滤包含字符串模式的行 [重复]

过滤列表中元素的 Pandas DataFrame [重复]