2017-10-21 12 views
0

DataFrameに多数のデータが格納されています。私は、ユーザーがの形で問合せ基準に合格することを可能にしようとしています:パンダ - クエリ文字列を作成し、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 
関連する問題