首页 > 解决方案 > 如何使用 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)

出于某种原因,代码没有遍历我列表中的每个字符序列。它只经过一个字符序列,但我需要它经过多个字符序列。

标签: pythonregexstringpandas

解决方案


由于没有可比较的数据,我将仅提供一些虚拟数据。

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', 
]

推荐阅读