Joe*_*Joe 4 python dataframe 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
Run Code Online (Sandbox Code Playgroud)
我希望能够对column运行查询字符串demo$gender。
即
df.query("demo$gender=='male'")
Run Code Online (Sandbox Code Playgroud)
但这有一个$标志问题。如果我$用另一个定界符(如-)替换符号,则问题仍然存在。我可以修复我的查询字符串以避免此问题。我不希望重命名这些列,因为这些列与应用程序的其他部分紧密对应。
我真的想坚持使用查询字符串,因为它是由我们技术堆栈的另一个组件提供的,而创建一个解析器对于看似简单的问题将是沉重的负担。
提前致谢。
dvi*_*laj 15
使用最新版本的 pandas,您可以使用反引号 (`) 转义包含特殊字符的列名称
df.query("`demo$gender` == 'male'")
Run Code Online (Sandbox Code Playgroud)
另一种可能性是在流程的前一步中清理列名称,用其他更合适的字符替换特殊字符。
例如:
(df
.rename(columns = lambda value: value.replace('$', '_'))
.query("demo_gender == 'male'")
)
Run Code Online (Sandbox Code Playgroud)
对于感兴趣的人,这里是我用来完成任务的简单过程:
# 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)
Run Code Online (Sandbox Code Playgroud)
这相当于标识无效的列名,转换查询并重命名列。最后,我们执行查询,然后将列名称转换回去。
感谢@chrisb的回答,它们为我指明了正确的方向