我在试着
-match美元/美分/百分比在数据框的列中出现的次数-create列出所有这些匹配项的函数-create计算匹配项数的函数
我可以成功地使用正则表达式来查找匹配项,但是我无法获得显示的列表并对它们进行计数。我尝试使用str.extract()列出所有匹配,并使用str.contains().sum()计算匹配的数量。然而,我不能让它们同时工作,我不确定这是不是正确的方法。
这是我到目前为止所知道的:
(?:^|\s)(\$?(?:\d[ ,.]?)+%?)(?=\s|$) 这将匹配任何美元/美分或百分比,并说明了我尝试包括的一系列不同的输入错误,因此regex字符串就可以了。
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列中的匹配项。
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()可能工作得更好,但我不确定如何让它们正常工作。
我希望上面的输出是这样的:
regex_number_matches = ['12.12%', '$10.12']
regex_number_matches_count = 2发布于 2018-01-18 06:24:38
如果您希望数据帧中出现%或$的总次数,请尝试
sample_csv.stack().str.contains('%|\$').sum()它返回4
如果您想要显示这些单元格的所有实例,请尝试
sample_csv[sample_csv.stack().str.contains('%|\$').unstack()]然后你就会得到
Amount Percent SMS_number SMS_text
0 12.12% 10% NaN $1
1 $10.12 NaN NaN NaN发布于 2018-01-18 06:42:11
(在我看来)您似乎希望在Amount列中找到那些不能转换为数字的值:
假设您具有以下DF:
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首先,为数量不能转换为数值的那些行创建一个布尔掩码:
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:
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]: 3https://stackoverflow.com/questions/48310832
复制相似问题