在 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])
我在这里要做的是计算数据框 df
的 A1
列中 不 包含任何条目的数量字母 A、T、C 和 G 的组合。
这些表达式应该算作 BadData
:
- 123
- <%*&
- foo
但是这些表达式不应该:
- 一个
- ATCG
- GATCATTA
我的问题:我如何使用正则表达式字符来包含诸如“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
使用 Python 中的 pandas 库,我的代码中有一个如下所示的设备:
BadData = len(df[df.A1.str.contains('A|T|C|G')==False])
我在这里要做的是计算数据框 df
的 A1
列中 不 包含任何条目的数量字母 A、T、C 和 G 的组合。
这些表达式应该算作 BadData
:
- 123
- <%*&
- foo
但是这些表达式不应该:
- 一个
- ATCG
- GATCATTA
我的问题:我如何使用正则表达式字符来包含诸如“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