我只需要从pandas DataFrame中获取某些行。我有一个关于酒店的数据框,结构就像这样
pool gym AC Breakfast
hotel1 1 0 1 0
hotel2 0 0 0 1
hotel3 0 1 1 0
....
现在,用户可以选择自己有哪些要求,例如带游泳池和空调的酒店。我想删除与用户给出的任何标准都不匹配的行。因此,以该示例为例,hotel2将从数据框中删除。
我试图遍历用户给定的条件,并创建一个条件,该条件将仅保留与至少一个给定属性匹配的行。
如果我对这些选项进行了硬编码,则此方法有效。
hotels = hotels([hotels.pool == 1) | (hotels.AC == 1)]
但是,由于用户给定的标准一直在变化,因此我建立了一个会生成相应标准的循环。像这样:
for key, value in usercriteria.items():
criteria += '(hotels[\'' + key + '\'] == 1) | '
# remove last OR operator
criteria = criteria[:-2]
但是,我不知道如何传递该变量值以将所需条件替换为数据框,从而仅给出正确的行。我尝试了以下格式:
hotels = hotels[criteria]
第一个出现键错误:KeyError:“(hotels ['pool'] == 1)|(hotels ['AC'] == 1)”
但是,如果我从错误消息中复制/粘贴密钥,并用它似乎可以代替标准。
我应该如何传递该变量,以便将其正确放置?是单引号有问题吗?
答案 0 :(得分:0)
要将表达式评估为字符串,请使用pandas.eval
:
import pandas as pd
usercriteria = {"pool": 1, "AC":1}
criteria = "hotels["
for key, value in usercriteria.items():
criteria += "(hotels['{}']=={})|".format(key, value)
criteria = criteria[:-1] + "]"
>>> print(pd.eval(criteria))
pool gym AC Breakfast
hotel
hotel1 1 0 1 0
hotel3 0 1 1 0
此外,正如@GeorgPoe建议的那样,您可以使用DataFrame
方法query
:
usercriteria = {"pool": 1, "AC":1}
criteria = ""
for key, value in usercriteria.items():
criteria += "({}=={})|".format(key, value)
criteria = criteria[:-1]
>>> print(hotels.query(criteria))
pool gym AC Breakfast
hotel
hotel1 1 0 1 0
hotel3 0 1 1 0