2017-08-16 34 views
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 

如果我願意 「打印QUERY_STRING」 我得到的輸出是

   "wlbWellType == 'EXPLORATION'" 

如果我做 「QUERY_STRING」 我得到的輸出是

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

我想要

   "wlbWellType == 'EXPLORATION'" 

作爲輸出而不使用打印語句。似乎有一個與間隙有關的錯誤。

的QUERY_STRING輸出將被用作:

  df.query(query_string) 

誰能請幫助我的上述問題?

在此先感謝

+0

你可以發佈'filters' DF/Series的小型可重複樣品嗎? – MaxU

+0

和我得到的錯誤是: '標籤[「wlbWellType == \'EXPLORATION \'」]不在[index]' –

+0

@ MaxU-我在DF中使用它時出錯。錯誤發佈在上面的評論中。 –

回答

1

的原因是,你是在包裹蟒蛇格式字符串的鍵(「‘{}’」。格式),以及。嘗試這種解決方案:

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 
+0

這一個工作。 謝謝所有:) –

0

考慮以下方法:

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"' 
1

您可以編寫自己的助手功能(類似於現在你想什麼但使用**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語法會做適當您取決於值的類型安全。