我有一堆数据存储在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来创建一个过滤的表来返回给用户,我将输入解析为get。
dframe_filtered = dframe[query_string]
然而,这失败了一个关键错误 - 我认为因为Python需要看到query_string不是真正的字符串 - 而是Pandas系列。有没有办法让这项工作?不确定您是否描述Python不将文本解析为字符串。但希望你们都有意义。
谢谢!
答案 0 :(得分: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