python - 如何使用 series.str.contains 函数浏览字符串列表?
问题描述
我有信用卡收费数据,其中有一列包含收费说明。我还创建了一个字典,其中包含不同费用的类别。例如,我有一个名为杂货费用(值)的类别和正则表达式(Ralphs、Target)。我将我的值与分隔符组合在一个字符串中|
。
我正在使用该Series.str.contains(pat,case=True,flags=0,na=nan,regex=True)
函数来查看每个索引中的字符串是否包含我的正则表达式。
# libraries needed
# import pandas as pd
# import re
joined_string=['|'.join(value) for value in values]
the_list=joined_string
示例输出:the_list=[Gas|Internet|Water|Electricity,VONS|RALPHS|Ralphs|PAVILIONS|FOOD4LESS|TRADER JOE'S|GROCERY OUTLET|FOOD 4 LESS|SPROUTS|MARKET@WORK"]
df['Description']='FOOD4LESS 0508 0000FULLERTON CA'
The Dataframe contains a column of different charges on your credit card
```python
for character_sequence in the_list:
boolean_output=df['Description'].str.contains(character_sequence,regex=True)
出于某种原因,代码没有遍历我列表中的每个字符序列。它只经过一个字符序列,但我需要它经过多个字符序列。
解决方案
由于没有可比较的数据,我将仅提供一些虚拟数据。
import pandas as pd
names = ['Adam','Barry','Chuck','Dennis','Elon','Fridman','George','Harry']
df = pd.DataFrame(names, columns=['Names'])
# Apply regex and save to column: Regex
df['Regex'] = df.Names.str.contains('[ae]', regex=True)
df
输出:
Names Regex
0 Adam True
1 Barry True
2 Chuck False
3 Dennis True
4 Elon False
5 Fridman True
6 George True
7 Harry True
与问题类似的另一个示例的解决方案
首先,您的the_list
变量不正确。假设这是一个错字,我会在这里提出我的解决方案。请注意,regex
或正则表达式,当应用于一列数据时,本质上意味着您正在尝试找到一些模式。您首先如何知道/检查您的模式识别是否工作正常?好吧,您至少需要一些数据点来验证正则表达式结果。由于您只提供了一行数据,因此,我将在这里制作一些虚拟数据并测试是否regex
产生预期结果。
注意:请检查数据准备部分以查看数据,以便您可以复制和测试解决方案。
import pandas as pd
import re
# Make regex string from the list of target keywords
regex_expression = '|'.join(the_list)
# Make dataframe from the list of descriptions
# --> see under Data section of the solution.
df = pd.DataFrame(descriptions, columns=['Description'])
# Regex search results for a subset of
# target keywords: "Gas|Internet|Water|Electricity,VONS"
df['Regex_A'] = df.Description.str.contains("Gas|Internet|Water|Electricity,VONS", regex=True)
# Regex search result of all target keywords
df['Regex_B'] = df.Description.str.contains(regex_expression, regex=True)
df
输出:
Description Regex_A Regex_B
0 FOOD4LESS 0508 0000FULLERTON CA False True
1 Electricity,VONS 0777 0123FULLERTON NY True True
2 PAVILIONS 1248 9800Ralphs MA False True
3 SPROUTS 9823 0770MARKET@WORK WI False True
4 Internet 0333 1008Water NJ True True
5 Enternet 0444 1008Wager NJ False False
数据准备
在实际场景中,我假设如果您在问题中提出的问题类型,您将有一个单词列表,您想在数据框列中查找。
所以,我冒昧地首先将您的字符串转换为字符串列表。
the_list="[Gas|Internet|Water|Electricity,VONS|RALPHS|Ralphs|PAVILIONS|FOOD4LESS|TRADER JOE'S|GROCERY OUTLET|FOOD 4 LESS|SPROUTS|MARKET@WORK]"
the_list = the_list.replace("[","").replace("]","").split("|")
the_list
输出:
['Gas',
'Internet',
'Water',
'Electricity,VONS',
'RALPHS',
'Ralphs',
'PAVILIONS',
'FOOD4LESS',
"TRADER JOE'S",
'GROCERY OUTLET',
'FOOD 4 LESS',
'SPROUTS',
'MARKET@WORK']
此外,我们制作了五行数据,其中包含我们正在寻找的关键字;然后在我们期望False
作为regex
模式搜索结果的地方添加另一行。
descriptions = [
'FOOD4LESS 0508 0000FULLERTON CA',
'Electricity,VONS 0777 0123FULLERTON NY',
'PAVILIONS 1248 9800Ralphs MA',
'SPROUTS 9823 0770MARKET@WORK WI',
'Internet 0333 1008Water NJ',
'Enternet 0444 1008Wager NJ',
]
推荐阅读
- r - 是否可以仅在 R 中使用 difftime 函数(即没有 DD/MM)?
- android - 在以编程方式添加的单选组中的单选按钮之间创建分隔线?
- java - MongoDB Aggregation - 如何使用 spring-data-mongodb 将查询表达式应用到匹配阶段?
- android - android中是否有这样的布局方向
- c++ - 为什么代码块要求我添加“;” 在别人的条件之后?如果我添加“:”,仍然存在逻辑错误。(查看问题正文以获取更多详细信息)
- python - 如何在 selenium 中更快地从动态网站读取数据
- powershell - 无法在powershell的数组列表中获取数组到json
- c++ - 在 C++ 中使用 Set 查找数组中的重复项
- c++ - 当我使用 WNetAddConnection2 或 WNetAddConnection3 时,如何让操作系统保存我的凭据?
- wix - 我可以处理无法启动服务的错误情况吗?