Pandas:列名包含特殊字符的查询字符串

新手上路,请多包涵

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

 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 运行查询字符串。

IE,

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

但这与 $ 标志有问题。如果我用另一个分隔符号(如 - )替换 $ 符号,那么问题仍然存在。我可以修复我的查询字符串以避免这个问题吗?我不想重命名这些列,因为它们与我的应用程序的其他部分紧密对应。

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

提前致谢。

原文由 Joe 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

使用最新版本的 pandas,您可以使用反引号 (`) 转义包含特殊字符的列名称

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

另一种可能性是在流程的前一步清理列名称,用其他更合适的字符替换特殊字符。

例如:

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

原文由 dvillaj 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

 # 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)

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

感谢@chrisb 的回答,为我指明了正确的方向

原文由 Joe 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题