我有一个包含多列的数据框,其中一列包含用空格分隔的字符串——这些字符串是属性列表的标题,并且有大写和小写单词。我正在尝试使用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 之后的第一个参数上——看来你不能使用列表作为输入,但我不知道应该使用什么其他函数来实现这一点。这是我发现的最接近的:
我认为你可以使用 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