2017-06-01 13 views
2

pandasでdf.renameを使用するときの私の間違いを理解しようとしています。具体的には、名前変更関数をタプルと共に使用するとエラーなしで実行されますが、列名は変更されません。Pandasのリストを使用して列名を置換する

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

あなたは3つのエントリ、名前を変更するそれぞれの列に対応してdictに合格したいでは正しいですが、あなたが渡しているdictではありません。これは1つのエントリのdictであり、1つのタプルをキーとし、1つは値です。

このように、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-updictを含む。 zipの使用法も含まれています。

+1

ディクショナリの作成が完璧に機能しました。ありがとうございました – Shawn

+0

お寄せいただきありがとうございます!そのリンクをチェックアウトしてください。包括性とジップはあらゆる種類のものに役立ちます。 –

1

列パラメータには、この方法でなければなりません:

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

使用このコードを取得する:あなたは、列の名前を変更したい場合は、

dict(zip(old_colnames, new_colnames)) 

このコードを使用するには、より簡単になります。

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

私はこのテクニックがどのようにうまくいくかを見ていますし、sparc_spreadの受け入れられた答えのようにジップテクニックも使用しています。 – Shawn

関連する問題