Python 3.x 有没有更好的办法用字典来解决这个问题?
我正在尝试解决以下问题: 示例csv数据集如下所示(数据集中共有1000行): 我试图解决的问题是:Python 3.x 有没有更好的办法用字典来解决这个问题?,python-3.x,pandas,dictionary,data-structures,Python 3.x,Pandas,Dictionary,Data Structures,我正在尝试解决以下问题: 示例csv数据集如下所示(数据集中共有1000行): 我试图解决的问题是: 机具和条件,例如钢制键盘应仅与包含钢制和键盘的项目名称匹配(不匹配 (必须按该顺序) 机具或条件,例如钢键盘应与项目名称钢表和木键盘匹配,因为它们各自包含 我们的搜索词之一 执行数字范围查询,例如价格在40美元到70美元之间的钢键盘 我已经使用以下方法解决了问题,但我觉得使用字典会使问题变得更简单: class SimpleSearch: def __init__(se
- 机具和条件,例如
应仅与包含钢制键盘
和钢制
的项目名称匹配(不匹配 (必须按该顺序)键盘
- 机具或条件,例如
应与项目名称钢键盘
和钢表
匹配,因为它们各自包含 我们的搜索词之一木键盘
- 执行数字范围查询,例如价格在40美元到70美元之间的
钢键盘
class SimpleSearch:
def __init__(self,path):
self.df = pd.read_csv(path)
def match_keyword(self, pattern):
self.df['matches'] = self.df['name'].str.findall(pattern).apply(lambda x: list(set(x)))
ids = []
for i in self.df.itertuples():
if i.matches != []:
ids.append(i.id)
return ids
if __name__ == '__main__':
path = "random_path/file.csv"
pattern = "steel keyboard"
search_obj = SimpleSearch(path)
print(search_obj.match_keyword(pattern))
- 是否有一种简单的方法可以使用字典区分
和
以及
或
操作的逻辑?我的解决方案只解决了这一点
- 解决数值范围查询的最佳方法是什么?我想不出一个方法,可以提供一些帮助
import re
search = "steel keyboard"
search = fr"({'|'.join(search.split())})" # '(steel|keyboard)'
min_price = 40
max_price = 70
name_result = df["name"].str.findall(search, re.IGNORECASE).apply(len)
price_result = df["price"].between(min_price, max_price)
out = df.loc[(name_result > 0) & (price_result == True)]
名称标准
同时做这两件事是可能的
import re
search = "steel keyboard"
search = fr"({'|'.join(search.split())})"
name_result = df["name"].str.findall(search, re.IGNORECASE).apply(len)
结果
同时应用所有规则:
out = df.loc[(name_result > 0) & (price_result == True)]
用dict求解
回答得很好。有没有办法用字典来解决这个问题?
import re
search = "steel keyboard"
search = fr"({'|'.join(search.split())})"
name_result = df["name"].str.findall(search, re.IGNORECASE).apply(len)
>>> pd.concat([df["name"], name_result], axis="columns")
name name
0 Lightweight Linen Watch 0 # no match
1 Steel Table 1 # partial match (ANY of words <- OR)
2 Keyboard With Steel Keys 2 # full match (ALL words <- AND)
3 Wooden Keyboard 1
4 Small Rubber Lamp 0
5 Durable Leather Car 0
6 Steel Keyboard 2
7 Fantastic Granite Bench 0
8 Apple Keyboard 1
min_price = 40
max_price = 70
price_result = df["price"].between(min_price, max_price)
out = df.loc[(name_result > 0) & (price_result == True)]
>>> out
name price
1 Steel Table 63.88
2 Keyboard With Steel Keys 48.24
6 Steel Keyboard 59.45
import re
search = "steel keyboard"
search = fr"({'|'.join(search.split())})" # '(steel|keyboard)'
search = re.compile(search, re.IGNORECASE)
min_price = 40
max_price = 70
data = df.set_index("name").squeeze().to_dict()
out = {name: price for name, price in data.items()
if search.search(name) and min_price <= price <= max_price}
>>> out
{'Steel Table': 63.88,
'Keyboard With Steel Keys': 48.24,
'Steel Keyboard': 59.45}