2017-06-01 94 views
2

我想了解在熊貓中使用df.rename時的錯誤。具體來說,使用帶有元組的重命名函數無誤地執行,但不更改列名稱。在熊貓中使用列表來替換列名稱

f_GreaterArea = pd.DataFrame(np.random.randn(5, 3), 
       index=['a', 'c', 'e', 'f', 'h'], 
       columns=['one', 'two', 'three']) 

print(f_GreaterArea) 

    one  two  three 
a 0.278969 -0.676388 -2.464444 
c -0.992077 -0.435534 2.267315 
e 2.094669 -1.401885 1.243658 
f 0.886835 0.195726 -0.132382 
h -0.920486 -0.298380 2.227378 

old_colnames = ('one', 'two', 'three') 
new_colnames = ('pig', 'cups', 'seven') 


f_GreaterArea.rename(columns={old_colnames:new_colnames}, inplace=True) 

print(f_GreaterArea) 

    one  two  three 
a 0.278969 -0.676388 -2.464444 
c -0.992077 -0.435534 2.267315 
e 2.094669 -1.401885 1.243658 
f 0.886835 0.195726 -0.132382 
h -0.920486 -0.298380 2.227378 
+1

是否有你需要使用元組的原因? –

+0

其實,我想要使用的是列表(並且sparc_spread的答案允許這樣做)。原因在於列表稍後很重要(例如,指定dropna列等)。 – Shawn

回答

4

你是想在dict有三個入口,一個是要重命名每列傳遞正確的,但是dict你逝去的是沒有的。它是一個條目的dict,其中一個元組作爲鍵,另一個作爲值。

使用dict理解把元組成dict,像這樣:

{i:j for i,j in zip(old_colnames,new_colnames)} 

因此,在你的代碼的情況下,這就是:

col_rename_dict = {i:j for i,j in zip(old_colnames,new_colnames)} 
f_GreaterArea.rename(columns=col_rename_dict, inplace=True) 

或者只是:

f_GreaterArea.rename(
    columns={i:j for i,j in zip(old_colnames,new_colnames)}, inplace=True 
) 

這裏的a nice little write-up一般理解,包括dict的理解。它還包括使用zip

+1

創建字典完美工作,謝謝 – Shawn

+0

很高興能夠幫助並感謝您的接受!確保查看該鏈接;理解和zip對各種東西都很有用。 –

1

列參數應該是這樣的:

{'one': 'pig', 'three': 'seven', 'two': 'cups'} 

使用此代碼來獲得它:

dict(zip(old_colnames, new_colnames)) 

如果你想更改列的名稱,使用此代碼會更加容易:

f_GreaterArea.columns = ('pig', 'cups', 'seven') 
+0

我看到這種技術是如何工作的,並且也使用了zip技術,就像在sparc_spread接受的答案中一樣。 – Shawn