2016-10-14 123 views
1

我與一個具有結構類似下面的數據幀的工作:熊貓:查詢字符串,其中列名中包含特殊字符

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'") 

但是,這與$符號的問題。如果我更換$另籤分隔(像-),那麼問題仍然存在。我可以修正我的查詢字符串以避免此問題。我不想重命名列,因爲它們與我的應用程序的其他部分緊密對應。

我真的想用一個查詢字符串來堅持,因爲它是由我們的技術堆棧的其他組件提供和創造一個解析器將是什麼似乎像一個簡單的問題了沉重的電梯。

在此先感謝。

回答

1

目前執行的query要求的字符串是一個有效的Python表達式,所以列名必須是有效的python標識符。你兩個選擇重命名列,或使用一個普通的布爾過濾器,像這樣:

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

感謝@chrisb。我很懷疑。 – Joe

1

對於這裏的興趣是一個簡單的proceedure我用來完成任務:

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

即達識別無效的列名,轉換查詢並重命名列。最後,我們執行查詢,然後將列名翻譯回來。

相關問題