Backlash error. Pandas filter dataframe using dynamic query string.

本小妞迷上赌 提交于 2019-12-20 06:37:08

问题


Hi all, The problem is related to the Python backlash error. I am creating a dynamic query string for filtering in pandas. The code is:

       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

If I do "print query_string" the output I got is

             "wlbWellType == 'EXPLORATION'"

If I do "query_string" the output I got is

             '"wlbWellType == \'EXPLORATION\'"'

I want

             "wlbWellType == 'EXPLORATION'" 

as the output without using print statement. Seems there is an error related to backlash.

The query_string output will then be used as:

            df.query(query_string)

Can anyone please help me with the above problem?

Thanks in advance


回答1:


You can write your own helper function (similar to what you're trying now but making use of **kwargs) and use the @varname syntax as the value placeholder.

def my_filter(df, **kwargs):
    qs = ' & '.join('{0} == @{0}'.format(k) for k in kwargs)
    return df.query(qs, local_dict=kwargs)

Then use as follows:

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

This method is safer than manually escaping values as the @varname syntax will do that appropriately for you depending on the value's type.




回答2:


The reason is that you are wrapping your key in python format string ( "'{}'".format ) as well. Try this solution:

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



回答3:


Consider the following approach:

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"

slightly different syntax:

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

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


来源:https://stackoverflow.com/questions/45711055/backlash-error-pandas-filter-dataframe-using-dynamic-query-string

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!