在 Python/Pandas 中使用正则表达式运算符有条件地计算数据条目

Using Regex Operators in Python/Pandas to Count Data Entries Conditionally

使用 Python 中的 pandas 库,我的代码中有一个如下所示的设备:

BadData = len(df[df.A1.str.contains('A|T|C|G')==False])

我在这里要做的是计算数据框 dfA1 列中 包含任何条目的数量字母 A、T、C 和 G 的组合。

这些表达式应该算作 BadData:

但是这些表达式不应该:

我的问题:我如何使用正则表达式字符来包含诸如“Apple”或“G 之类的条目olfing" 在 BadData?

我可以像这样将条件链接在一起:

BadData = len(df[(df.A1.str.contains('A|T|C|G')==False) & (df.A1.str.contains('0|1|2|3')==TRUE)])

但是这里我遇到了一个难题:是否必须定义每一个违反条件的字符?这看起来很笨拙,我相信还有更优雅的方法。

您可以使用:

df['A1'].str.contains('^[ACTG]+$')

这确保它以 ACTG 中的字母开始(正则表达式 ^)和结束(正则表达式 $),并且只包含其中一个或多个字符。

要获得 len,您只需对 False 值求和即可:

bad_data = sum(~df['A1'].str.contains('^[ACTG]+$'))

相当于:

bad_data = len(df[df.A1.str.contains('^[ACTG]+$')==False])

但 IMO 更好读。

例如:

>>> df
             A1
0         Apple
1       Golfing
2             A
3          ATTC
4          ACGT
5         AxTCG
6           foo
7             %
8  ACT Golf GTC
9           ACT


>>> df['A1'].str.contains('^[ACTG]+$')
0    False
1    False
2     True
3     True
4     True
5    False
6    False
7    False
8    False
9     True
Name: A1, dtype: bool

bad_data = sum(~df['A1'].str.contains('^[ACTG]+$'))
# 6