Pandas:查询字符串,其中列名包含特殊字符

时间:2016-10-14 14:24:08

标签: python pandas dataframe

我正在使用具有如下结构的数据框:

In[75]: df.head(2)
Out[75]: 
  statusdata             participant_id association  latency response  \
0   complete  CLIENT-TEST-1476362617727       seeya      715  dislike   
1   complete  CLIENT-TEST-1476362617727      welome      800     like   

   stimuli elementdata statusmetadata demo$gender  demo$question2  \
0  Sample B    semi_imp       complete        male              23   
1  Sample C    semi_imp       complete      female              23   

我希望能够针对列demo$gender运行查询字符串。

即,

df.query("demo$gender=='male'")

但是$符号存在问题。如果我将$符号替换为另一个分隔符(例如-),则问题仍然存在。我可以修复我的查询字符串以避免此问题。我宁愿不重命名列,因为这些列与我的应用程序的其他部分紧密对应。

我真的想坚持使用查询字符串,因为它是由我们的技术堆栈的另一个组件提供的,并且创建一个解析器对于看似简单的问题来说将是一个沉重的提升。

提前致谢。

3 个答案:

答案 0 :(得分:5)

对于感兴趣的人来说,这是我用来完成任务的简单过程:

# Identify invalid column names
invalid_column_names = [x for x in list(df.columns.values) if not x.isidentifier() ]

# Make replacements in the query and keep track
# NOTE: This method fails if the frame has columns called REPL_0 etc.
replacements = dict()
for cn in invalid_column_names:
    r = 'REPL_'+ str(invalid_column_names.index(cn))
    query = query.replace(cn, r)
    replacements[cn] = r

inv_replacements = {replacements[k] : k for k in replacements.keys()}

df = df.rename(columns=replacements) # Rename the columns
df  = df.query(query) # Carry out query

df = df.rename(columns=inv_replacements)

这相当于识别无效的列名,转换查询并重命名列。最后,我们执行查询,然后将列名转换回来。

答案 1 :(得分:3)

query的当前实现要求字符串是有效的python表达式,因此列名必须是有效的python标识符。您的两个选项是重命名列,或使用普通布尔过滤器,如下所示:

df[df['demo$gender'] =='male']

答案 2 :(得分:0)

使用实际版本的 Pandas,您可以使用反引号 (`) 代替列名

df.query("`demo$gender` == 'male'")

其他可能性是在您的流程的上一步中清除列名称,用其他一些更合适的字符替换特殊字符。

例如:

(df
 .rename(columns = lambda value: value.replace('$', '_'))
 .query("demo_gender == 'male'")
)