Pandas - 构建查询字符串,用于切片DataFrame

时间:2017-10-21 18:32:22

标签: string pandas parsing 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来创建一个过滤的表来返回给用户,我将输入解析为get。

dframe_filtered = dframe[query_string]

然而,这失败了一个关键错误 - 我认为因为Python需要看到query_string不是真正的字符串 - 而是Pandas系列。有没有办法让这项工作?不确定您是否描述Python不将文本解析为字符串。但希望你们都有意义。

谢谢!

1 个答案:

答案 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