2017-07-18 56 views
2

我有一個混合列名類型的DataFrame:一些列名是字符串,一些是元組。 有沒有辦法重新排列列而不更改列名的類型?重新排列具有混合元組和字符串列的pandas DataFrame列

例如,如果所有列是字符串,這工作得很好:

df = pd.DataFrame([["Alice", 34], 
        ["Bob", 55]]) 
df.columns = ["name", "age"] 
df[["age", "name"]] 

# Out: 
    age name 
0 34 Alice 
1 55 Bob 

如果所有列元組,這也是沒有問題的工作原理:

df = pd.DataFrame([[5, 30], 
        [6, 31]]) 
df.columns = [(0,0), (1,1)] 
df[[(1,1), (0,0)]] 

# Out[15]: 
    (1, 1) (0, 0) 
0  30  5 
1  31  6 

但是,如果列混合字符串和元組,這是一個錯誤。

df = pd.DataFrame([["Alice", 0, 34], 
        ["Bob", 1, 55]]) 
df.columns = ["name", (0,0), "age"] 
df[["age", "name", (0,0)]] 

# Out: 
ValueError: setting an array element with a sequence 

我可以通過將列中的元組轉換爲字符串,或將字符串轉換爲元組,然後轉換回來來解決此問題。 但是,我真的很想知道是什麼原因導致了這個錯誤,並且是否有辦法以更優雅的方式繞過它。

+0

錯誤源於構造函數'np.array',用於設置數據框的列。您將不匹配的數據類型(字符串和元組)傳遞給'np.array',這對於數組來說並不一致。 – Abdou

回答

1

df[np.array(["age", "name", (0,0)],dtype=object)]的作品。

正如您所指出的那樣,Python正在抱怨,因爲包含列名稱的數組同時具有元組值和字符串值。但是明確地用dtype=object規範創建一個數組告訴數組保持任意對象而不是抱怨。如果跳過dtype參數,則推斷dtype,並且Python假定整個數組的dtype相同,從而導致錯誤。

+0

你知道爲什麼這不是混合字符串和數字列名稱的問題,而是混合字符串和元組列名稱的問題嗎? – cjrieds

+0

不幸的是,不知道。我對Python進行了一次快速測試,其中我將名稱爲「(0,0)」的列重命名爲標量「0」。然後,「df.columns」給出了「#Out Index(['name ',0,'age'],dtype ='object'),''表示在混合字符串和數字列名的情況下,正確推斷對象dtype。但我不確定爲什麼這個正確的推論發生。 – hausdork