2017-08-28 124 views
0

我正在使用2个变量的DataFrame查询。 第一个变量是列标签,第二个是值列表。 我想要做的是选择该列中包含该列表中的值的所有行。奇怪的是,如果我写的列标签作为字符串没有错误,而引用该列标签变量提供了以下错误:熊猫DataFrame:查询变量

Traceback (most recent call last): 
    File "C:\Python\Python36\lib\site-packages\pandas\indexes\base.py", line 2134, in get_loc 
    return self._engine.get_loc(key) 
    File "pandas\index.pyx", line 132, in pandas.index.IndexEngine.get_loc (pandas\index.c:4433) 
    File "pandas\index.pyx", line 151, in pandas.index.IndexEngine.get_loc (pandas\index.c:4238) 
    File "pandas\index.pyx", line 388, in pandas.index.Int64Engine._check_type (pandas\index.c:8171) 
KeyError: False 

这是工作代码:

rhs_values_list = df1["RHS"].tolist() 
query = "shoe_size in @rhs_values_list" 
result_set = df2.query(query) 

而这种上升上述错误:

rhs_values_list = df1["RHS"].tolist() 
col = "shoe_size" 
query = "@col in @rhs_values_list" 
result_set = df2.query(query) 

是不是有什么毛病查询的第二个版本?

回答

1

您正在做的是在字符串中执行@col的实际查询,而不是绑定到该变量的值。你可以使用字符串插值例如:

rhs_values_list = df1["RHS"].tolist() 
    col = "shoe_size" 
    query = "{} in @rhs_values_list".format(col) 
    result_set = df2.query(relaxed_query) 
+0

使用像这样的字符串插值的FYI通常不是一个好主意。理想情况下,您希望使用允许参数化查询的库,并将清理任何变量。 – Solaxun

+0

在这种情况下,SQL注入不是一个问题,因为您无法将表格变异查询传递给'df.query'。 –

+0

大家好,熊猫让你回来:) – Solaxun