如何将变量值作为pandas数据框列名传递

时间:2019-05-03 13:28:11

标签: python pandas

我只需要从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)”

但是,如果我从错误消息中复制/粘贴密钥,并用它似乎可以代替标准。

我应该如何传递该变量,以便将其正确放置?是单引号有问题吗?

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