2017-10-21 103 views
0

我有一堆數據存儲在DataFrame中。我試圖讓用戶在查詢條件通過以下形式:熊貓 - 構建查詢字符串,用於切片數據幀

column, operator, variable_name 

所以用戶可能通過在下面作爲一個例子

'Action equal allow,total_bytes > 10000,application neq facebook' 

我通過拆分和格式化成解析字符串看起來像這樣

query_string = (dframe['Action'] == 'allow') & (dframe['total_bytes'] > 10000) & ~(dframe[''Application] == 'facebook') 

查詢字符串然後,我試圖創建一個過濾表通過傳入QUERY_STRING返回到用戶我分析的輸入來獲得。

dframe_filtered = dframe[query_string] 

但是這個失敗的一個關鍵錯誤 - 我想因爲Python需要看到QUERY_STRING作爲不是一個真正的串 - 但熊貓系列。有沒有辦法做到這一點?不確定你描述了Python沒有將文本解析爲字符串。但希望你們都有意義。

謝謝!

+0

你有沒有看着'df.query'走用戶輸入的格式是? –

回答

0

粗,快速和骯髒的方式來查詢字符串轉換(假設它總是會在這個格式)轉換爲機器可讀的形式是:

from functools import reduce 
s = 'Action equal allow,total_bytes > 10000,Application neq facebook' 
symbols = {'equal':'==', '>': '>', 'neq':'!=',',':'&'} 

s1 = reduce(lambda x, y: x.replace(y, symbols[y]), symbols, s) 
splits=s1.split('&') 
splits1 = '('+splits[0].replace(splits[0].split()[2], '\''+splits[0].split()[2]+'\'')+')&(' 
splits2 = splits[1] 
splits3 = ')&('+splits[2].replace(splits[2].split()[2],'\''+splits[2].split()[2]+'\')') 
s2 = splits1+splits2+splits3 
df1.query(s2) 

    Action Application total_bytes 
0 allow app1 11000 
3 allow app3 15000 
4 allow app5 17000