パンダの特定の列の名前を変更するにはどうすればよいですか?
v0.24以降、一度に1つ以上の列の名前を変更するには、
すべての列の名前を一度に変更する必要がある場合は、
rename
と axis=1
df = pd.DataFrame('x', columns=['y', 'gdp', 'cap'], index=range(5))
df
y gdp cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
0.21+では、次のようにaxis
パラメーターを指定できますrename
。
df.rename({'gdp':'log(gdp)'}, axis=1)
# df.rename({'gdp':'log(gdp)'}, axis='columns')
y log(gdp) cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
(これrename
はデフォルトではインプレースではないため、結果を割り当てる必要があります。)
この追加は、他のAPIとの一貫性を向上させるために行われました。新しいaxis
引数はcolumns
パラメータに似ています—同じことをします。
df.rename(columns={'gdp': 'log(gdp)'})
y log(gdp) cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
rename
各列に対して一度呼び出されるコールバックも受け入れます。
df.rename(lambda x: x[0], axis=1)
# df.rename(lambda x: x[0], axis='columns')
y g c
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
この特定のシナリオでは、
df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis=1)
replace
Pythonの文字列のメソッドと同様に、pandas IndexとSeries(オブジェクトdtypeのみ)は、str.replace
文字列と正規表現ベースの置換のための(「ベクトル化された」)メソッドを定義します。
df.columns = df.columns.str.replace('gdp', 'log(gdp)')
df
y log(gdp) cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
他の方法に対するこれの利点は、str.replace
正規表現をサポートすることです(デフォルトで有効)。詳細については、ドキュメントを参照してください。
リストを渡すset_axis
とaxis=1
set_axis
ヘッダーのリストを指定して呼び出します。リストの長さは列/インデックスサイズと同じである必要があります。set_axis
デフォルトでは元のDataFrameを変更しますがinplace=False
、変更されたコピーを返すように指定できます。
df.set_axis(['cap', 'log(gdp)', 'y'], axis=1, inplace=False)
# df.set_axis(['cap', 'log(gdp)', 'y'], axis='columns', inplace=False)
cap log(gdp) y
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
注:将来のリリースでinplace
は、デフォルトでになりますTrue
。
メソッドの連鎖
なぜset_axis
列を割り当てる効率的な方法があるのに、なぜ選択するのdf.columns = ...
ですか?[この回答]のTed Petrouが示しているように、(https://stackoverflow.com/a/46912050/4909087)set_axis
は、メソッドをチェーンしようとするときに役立ちます。
比較する
# new for pandas 0.21+
df.some_method1()
.some_method2()
.set_axis()
.some_method3()
対
# old way
df1 = df.some_method1()
.some_method2()
df1.columns = columns
df1.some_method3()
前者はより自然で自由に流れる構文です。