熊猫 - 构建查询字符串,用于切片数据帧
问题描述:
我有一堆数据存储在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没有将文本解析为字符串。但希望你们都有意义。
谢谢!
答
粗,快速和肮脏的方式来查询字符串转换(假设它总是会在这个格式)转换为机器可读的形式是:
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
你有没有看着'df.query'走用户输入的格式是? –