反冲错误。 Pandas使用动态查询字符串过滤数据帧。
问题描述:
大家好, 该问题与Python间隙错误有关。 我正在创建一个动态查询字符串,用于在熊猫中进行过滤。 的代码是:反冲错误。 Pandas使用动态查询字符串过滤数据帧。
filters = dict(wlbWellType=['EXPLORATION'])
query_string = ''
index = 0
for (k,v) in filters.iteritems():
for i in v:
if (index == 0):
query_string += '"{}"'.format((k) + ' == '+"'{}'".format(i))
else:
query_string += ' & ' '"{}"'.format((k) + ' == ' +
"'{}'".format(i))
index += 1
如果我愿意 “打印QUERY_STRING” 我得到的输出是
"wlbWellType == 'EXPLORATION'"
如果我做 “QUERY_STRING” 我得到的输出是
'"wlbWellType == \'EXPLORATION\'"'
我想要
"wlbWellType == 'EXPLORATION'"
作为输出而不使用打印语句。似乎有一个与间隙有关的错误。
的QUERY_STRING输出将被用作:
df.query(query_string)
谁能请帮助我的上述问题?
在此先感谢
答
的原因是,你是在包裹蟒蛇格式字符串的键(“‘{}’”。格式),以及。尝试这种解决方案:
query_string = ""
index = 0
for (k,v) in filters.iteritems():
for i in v:
if (index == 0):
query_string += str(k) + " == " + "'{}'".format(i)
else:
query_string += " & " + str(k) + " == " + "'{}'".format(i)
index += 1
+0
这一个工作。 谢谢所有:) –
答
考虑以下方法:
In [44]: filters
Out[44]:
col val
0 wlbWellType EXPLORATION
1 bbb BBB
In [45]: qry = filters['col'].add(' == "').add(filters['val']).add('"').str.cat(sep=' & ')
In [46]: print(qry)
wlbWellType == "EXPLORATION" & bbb == "BBB"
语法稍有不同:
In [50]: qry = (filters['col'] + ' == "' + filters['val'] + '"').str.cat(sep=' & ')
In [51]: qry
Out[51]: 'wlbWellType == "EXPLORATION" & bbb == "BBB"'
答
您可以编写自己的助手功能(类似于现在你想什么但使用**kwargs
)并使用@varname
语法作为值占位符。
def my_filter(df, **kwargs):
qs = ' & '.join('{0} == @{0}'.format(k) for k in kwargs)
return df.query(qs, local_dict=kwargs)
然后使用方法如下:
new_df = my_filter(df, wlbWellType='EXPLORATION', otherColumn='SOMETHING')
这种方法比手动转义值作为@varname
语法会做适当您取决于值的类型安全。
你可以发布'filters' DF/Series的小型可重复样品吗? – MaxU
和我得到的错误是: '标签[“wlbWellType == \'EXPLORATION \'”]不在[index]' –
@ MaxU-我在DF中使用它时出错。错误发布在上面的评论中。 –