Python 2.7 齿隙误差。熊猫使用动态查询字符串筛选数据帧。

Python 2.7 齿隙误差。熊猫使用动态查询字符串筛选数据帧。,python-2.7,pandas,query-string,Python 2.7,Pandas,Query String,大家好, 该问题与Python齿隙错误有关。 我正在创建一个动态查询字符串,以便在pandas中进行筛选。 代码是: filters = dict(wlbWellType=['EXPLORATION']) query_string = '' index = 0 for (k,v) in filters.iteritems(): for i in v: if (index == 0):

大家好, 该问题与Python齿隙错误有关。 我正在创建一个动态查询字符串,以便在pandas中进行筛选。 代码是:

       filters = dict(wlbWellType=['EXPLORATION'])
       query_string = ''
       index = 0
       for (k,v) in filters.iteritems():
          for i in v:
              if (index == 0):
                  query_string += '"{}"'.format((k) + ' == '+"'{}'".format(i)) 
              else:
              query_string += ' & ' '"{}"'.format((k) + ' == ' + 
              "'{}'".format(i))
             index += 1
如果我执行“打印查询字符串”,我得到的输出是

             "wlbWellType == 'EXPLORATION'"
             '"wlbWellType == \'EXPLORATION\'"'
如果我做“查询字符串”,我得到的输出是

             "wlbWellType == 'EXPLORATION'"
             '"wlbWellType == \'EXPLORATION\'"'
我想要

             "wlbWellType == 'EXPLORATION'" 
作为输出,不使用print语句。似乎有一个错误与反弹有关

然后,查询字符串输出将用作:

            df.query(query_string)
有人能帮我解决上述问题吗


提前感谢

原因是您正在用python格式字符串(“{}.”格式)包装密钥。尝试以下解决方案:

query_string = ""
index = 0
for (k,v) in filters.iteritems():
  for i in v:
    if (index == 0):
      query_string += str(k) + " == " + "'{}'".format(i)
    else:
      query_string += " & " + str(k) + " == " + "'{}'".format(i)
  index += 1

原因是您也在用python格式字符串(“{}”.format)包装密钥。尝试以下解决方案:

query_string = ""
index = 0
for (k,v) in filters.iteritems():
  for i in v:
    if (index == 0):
      query_string += str(k) + " == " + "'{}'".format(i)
    else:
      query_string += " & " + str(k) + " == " + "'{}'".format(i)
  index += 1

考虑以下方法:

In [44]: filters
Out[44]:
           col          val
0  wlbWellType  EXPLORATION
1          bbb          BBB

In [45]: qry = filters['col'].add(' == "').add(filters['val']).add('"').str.cat(sep=' & ')

In [46]: print(qry)
wlbWellType == "EXPLORATION" & bbb == "BBB"
语法略有不同:

In [50]: qry = (filters['col'] + ' == "' + filters['val'] + '"').str.cat(sep=' & ')

In [51]: qry
Out[51]: 'wlbWellType == "EXPLORATION" & bbb == "BBB"'

考虑以下方法:

In [44]: filters
Out[44]:
           col          val
0  wlbWellType  EXPLORATION
1          bbb          BBB

In [45]: qry = filters['col'].add(' == "').add(filters['val']).add('"').str.cat(sep=' & ')

In [46]: print(qry)
wlbWellType == "EXPLORATION" & bbb == "BBB"
语法略有不同:

In [50]: qry = (filters['col'] + ' == "' + filters['val'] + '"').str.cat(sep=' & ')

In [51]: qry
Out[51]: 'wlbWellType == "EXPLORATION" & bbb == "BBB"'

您可以编写自己的helper函数(与您现在尝试的类似,但使用
**kwargs
),并使用
@varname
语法作为值占位符

def my_filter(df, **kwargs):
    qs = ' & '.join('{0} == @{0}'.format(k) for k in kwargs)
    return df.query(qs, local_dict=kwargs)
然后按如下方式使用:

new_df = my_filter(df, wlbWellType='EXPLORATION', otherColumn='SOMETHING')

此方法比手动转义值更安全,因为
@varname
语法将根据值的类型适当地为您执行此操作。

您可以编写自己的帮助函数(与您现在尝试的类似,但使用
**kwargs
)并使用
@varname
语法作为值占位符

def my_filter(df, **kwargs):
    qs = ' & '.join('{0} == @{0}'.format(k) for k in kwargs)
    return df.query(qs, local_dict=kwargs)
然后按如下方式使用:

new_df = my_filter(df, wlbWellType='EXPLORATION', otherColumn='SOMETHING')

此方法比手动转义值更安全,因为
@varname
语法将根据值的类型对您进行适当的转义。

您可以发布一个小的
过滤器的可复制样本吗
DF/Series?我得到的错误是:“[index]中没有标签[“wlbWellType=\'EXPLORATION\””“@MaxU-我在DF中使用它时出错了。错误在上面的评论中发布。你能发布一个小的可复制的
过滤器样本吗
DF/Series?我得到的错误是:“[index]@MaxU中没有标签[“wlbWellType==\'EXPLORATION\'””。@当我在DF中使用它时,我得到了一个错误。该错误已发布在上面的评论中。