如何编写 for 循环或列表理解来迭代字符串列并从列表中的新列中返回布尔值或类别?

问题描述 投票:0回答:1

我有一个包含多列的数据框,其中一列包含用空格分隔的字符串——这些字符串是属性列表的标题,并且有大写和小写单词。我正在尝试使用Python正则表达式模块(re)编写一个for循环和一个列表理解,该模块将迭代字符串并根据定义的搜索词列表返回布尔值(True/False)或分类名称。最后,我想将其输出到数据框中的新列中。

这是我的数据框的最小示例:

data = {'id': [748, 896, 5268],
        'name' : ['Bright, Modern Garden Unit - 1BR/1BTH', 'Renovated Alamo Square Victorian', 'Mission Sunny, near Park'],
        'price': [209, 255, 180]}
df = pd.DataFrame(data)
print(df)

这就是它产生的:

     id                                   name  price
0   748  Bright, Modern Garden Unit - 1BR/1BTH    209
1   896       Renovated Alamo Square Victorian    255
2  5268               Mission Sunny, near Park    180

这就是我想要得到的布尔输出:

     id                                   name  price  amenities_bool
0   748  Bright, Modern Garden Unit - 1BR/1BTH    209            True
1   896       Renovated Alamo Square Victorian    255            True
2  5268               Mission Sunny, near Park    180            True

这就是我想要获得的指定分类输出:

     id                                   name  price  amenities_bool  \
0   748  Bright, Modern Garden Unit - 1BR/1BTH    209            True   
1   896       Renovated Alamo Square Victorian    255            True   
2  5268               Mission Sunny, near Park    180            True   

  amenities_descp  
0          bright  
1       renovated  
2            near 

到目前为止我所做的:

我使用此代码在字符串列中单独搜索特定单词:

df_deep_2[df_deep_2['name'].str.contains('modern', regex=True, flags=re.IGNORECASE)].shape

返回:

(13267, 21)

我想使用类似以下示例的内容来实现上述目标,但除了我已经演示的内容之外,我不知道正则表达式的语法或字符:

对于布尔输出,例如:

amenities_descp = ['parking', 'free', 'air', 'wifi', 'pool', 'hot tub', 'close', 'garden', 'bright', 'luxury', 'renovated', 'modern', 'green', 'near', 'convenient']

df['amenities_bool'] = False  # default value

for index, row in df.iterrows():
    if row['name'] in amenities_descp:
        df.at[index, 'amenities_bool'] = True

对于指定的分类输出,例如:

 amenities_spec = ['parking': 'parking', 'free': 'free', 'air': 'air', 'wifi': 'wifi', 'pool': 'pool', 'hot tub': 'hot tub', 'close': 'close', 'garden': 'garden', 'bright': 'bright', 'luxury': 'luxury', 'renovated': 'renovated', 'modern': 'modern', 'green': 'green', 'green': 'green', 'convenient': 'convenient']

df['amenities_type'] = [amenities_spec[amenity] if amenity in amenities_spec else 'None' for amenity in df['name']]

我陷入困境的是如何/在哪里合并正则表达式语法;我得到的最接近的是以下:

df_deep_copy['amenities_bool'] = [True if amenity in amenities else False for amenity in df_deep_copy[df_deep_copy['name'].str.contains(amenities_desc, regex=True, flags=re.IGNORECASE)]]

这会导致不可散列类型的类型错误:列表。我意识到问题出在 .str.contains 之后的第一个参数上——看来你不能使用列表作为输入,但我不知道应该使用什么其他函数来实现这一点。这是我发现的最接近的:

在 DataFrame 列中搜索单词并忽略正则表达式和子字符串

python pandas regex loops list-comprehension
1个回答
0
投票

我认为你可以使用 Series.str.contains(pat) 接受正则表达式,如下所示:

data = {'id': [748, 896, 5268],
                'name' : ['Bright, Modern Garden Unit - 1BR/1BTH', 'Renovated Alamo Square Victorian', 'Mission Sunny, near Park'],
                'price': [209, 255, 180]}
df = pd.DataFrame(data)
print(df)

     id                                   name  price
0   748  Bright, Modern Garden Unit - 1BR/1BTH    209
1   896       Renovated Alamo Square Victorian    255
2  5268               Mission Sunny, near Park    180

amenities_descp = ['parking', 'free', 'air', 'wifi', 'pool', 'hot tub', 'close', 'garden', 'bright', 'luxury', 'renovated', 'modern', 'green', 'near', 'convenient']

df['amenities_bool'] = df.name.str.contains('|'.join(amenities_descp))

您可以进行正则表达式类型匹配,而不是特定单词

rooms_descp = ('\d+BR','\d+BTH')
df['rooms_bool'] = df.name.str.contains('|'.join(rooms_descp))
print(df)

     id                                   name  price  rooms_bool
0   748  Bright, Modern Garden Unit - 1BR/1BTH    209        True
1   896       Renovated Alamo Square Victorian    255       False
2  5268               Mission Sunny, near Park    180       False​​
© www.soinside.com 2019 - 2024. All rights reserved.