首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中根据数据框创建正则表达式匹配列表,然后计算匹配数

问在Python中根据数据框创建正则表达式匹配列表,然后计算匹配数
EN

Stack Overflow用户
提问于 2018-01-18 06:09:26
回答 2查看 193关注 0票数 1

我在试着

-match美元/美分/百分比在数据框的列中出现的次数-create列出所有这些匹配项的函数-create计算匹配项数的函数

我可以成功地使用正则表达式来查找匹配项,但是我无法获得显示的列表并对它们进行计数。我尝试使用str.extract()列出所有匹配,并使用str.contains().sum()计算匹配的数量。然而,我不能让它们同时工作,我不确定这是不是正确的方法。

这是我到目前为止所知道的:

代码语言:javascript
复制
(?:^|\s)(\$?(?:\d[ ,.]?)+%?)(?=\s|$) 

这将匹配任何美元/美分或百分比,并说明了我尝试包括的一系列不同的输入错误,因此regex字符串就可以了。

代码语言:javascript
复制
import re
import pandas as pd

sample_csv = pd.DataFrame({'SMS_text': ['$1', '214-233-4455'],
                           'SMS_number': ['1', '1'],
                           'Amount': ['12.12%', '$10.12'],
                           'Percent': ['10%', '1']})

sample_csv.Amount.str.extract(r'(\$?(?:\d[ ,.]?)+%?)(?=\s|$)')

这将列出Amount列中的匹配项。

代码语言:javascript
复制
0    12.12%
1    $10.12
Name: Amount, dtype: object

如果我用sample_csv.Amount.str.contains(r'(\$?(?:\d[ ,.]?)+%?)(?=\s|$)').sum()替换str.extract(),它会告诉我有多少个匹配项(即2个),但同样,我不能让它们同时工作。

这是正确的方法,还是我设置错了?看起来也许findall()或re.compile()可能工作得更好,但我不确定如何让它们正常工作。

我希望上面的输出是这样的:

代码语言:javascript
复制
regex_number_matches = ['12.12%', '$10.12']
regex_number_matches_count = 2
EN

回答 2

Stack Overflow用户

发布于 2018-01-18 06:24:38

如果您希望数据帧中出现%或$的总次数,请尝试

代码语言:javascript
复制
sample_csv.stack().str.contains('%|\$').sum()

它返回4

如果您想要显示这些单元格的所有实例,请尝试

代码语言:javascript
复制
sample_csv[sample_csv.stack().str.contains('%|\$').unstack()]

然后你就会得到

代码语言:javascript
复制
    Amount  Percent SMS_number  SMS_text
0   12.12%  10%     NaN         $1
1   $10.12  NaN     NaN         NaN
票数 2
EN

Stack Overflow用户

发布于 2018-01-18 06:42:11

(在我看来)您似乎希望在Amount列中找到那些不能转换为数字的值:

假设您具有以下DF:

代码语言:javascript
复制
In [107]: sample_csv
Out[107]:
   Amount Percent  SMS_number      SMS_text
0  12.12%     10%           1            $1
1  $10.12       1           1  214-233-4455
2    1.23       2           1  214-233-4455
3    33,5       3           1  214-233-4455

首先,为数量不能转换为数值的那些行创建一个布尔掩码:

代码语言:javascript
复制
In [108]: mask = pd.to_numeric(sample_csv['Amount'], errors='coerce').isnull()

In [109]: mask
Out[109]:
0     True
1     True
2    False
3     True
Name: Amount, dtype: bool

现在,您可以使用以下掩码轻松过滤DF:

代码语言:javascript
复制
In [110]: sample_csv.loc[mask, 'Amount']
Out[110]:
0    12.12%
1    $10.12
3      33,5
Name: Amount, dtype: object

In [111]: sample_csv.loc[mask, 'Amount'].tolist()
Out[111]: ['12.12%', '$10.12', '33,5']

In [112]: len(sample_csv.loc[mask, 'Amount'])
Out[112]: 3
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48310832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档