元の列ラベルを置き換えるために編集する必要がある Pandas と列ラベルを使用する DataFrame があります。
A
元の列名が次の DataFrame の列名を変更したいと思います。
['$a', '$b', '$c', '$d', '$e']
に
['a', 'b', 'c', 'd', 'e'].
編集した列名をリストに保存していますが、列名を置き換える方法がわかりません。
関数を使用して、df.rename()
名前を変更する列を参照します。すべての列の名前を変更する必要はありません。
df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})
# Or rename the existing DataFrame (rather than creating a copy)
df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'}, inplace=True)
最小限のコード例
df = pd.DataFrame('x', index=range(3), columns=list('abcde'))
df
a b c d e
0 x x x x x
1 x x x x x
2 x x x x x
次のメソッドはすべて機能し、同じ出力を生成します。
df2 = df.rename({'a': 'X', 'b': 'Y'}, axis=1) # new method
df2 = df.rename({'a': 'X', 'b': 'Y'}, axis='columns')
df2 = df.rename(columns={'a': 'X', 'b': 'Y'}) # old method
df2
X Y c d e
0 x x x x x
1 x x x x x
2 x x x x x
変更はインプレースではないため、結果を元に戻すことを忘れないでください。または、次のように指定しますinplace=True
。
df.rename({'a': 'X', 'b': 'Y'}, axis=1, inplace=True)
df
X Y c d e
0 x x x x x
1 x x x x x
2 x x x x x
v0.25 からerrors='raise'
、無効な column-to-rename が指定された場合にエラーを発生させるように指定することもできます。v0.25rename()
ドキュメントを参照してください。
and (コピーを返す)df.set_axis()
と一緒に使用します。axis=1
inplace=False
df2 = df.set_axis(['V', 'W', 'X', 'Y', 'Z'], axis=1, inplace=False)
df2
V W X Y Z
0 x x x x x
1 x x x x x
2 x x x x x
これによりコピーが返されますが、設定によってその場で DataFrame を変更できますinplace=True
(これはバージョン <=0.24 のデフォルトの動作ですが、将来変更される可能性があります)。
ヘッダーを直接割り当てることもできます。
df.columns = ['V', 'W', 'X', 'Y', 'Z']
df
V W X Y Z
0 x x x x x
1 x x x x x
2 x x x x x
.columns
それを属性に割り当てるだけです:
>>> df = pd.DataFrame({'$a':[1,2], '$b': [10,20]})
>>> df
$a $b
0 1 10
1 2 20
>>> df.columns = ['a', 'b']
>>> df
a b
0 1 10
1 2 20
このメソッドは、次のようにfunctionrename
を取ることができます。
In [11]: df.columns
Out[11]: Index([u'$a', u'$b', u'$c', u'$d', u'$e'], dtype=object)
In [12]: df.rename(columns=lambda x: x[1:], inplace=True)
In [13]: df.columns
Out[13]: Index([u'a', u'b', u'c', u'd', u'e'], dtype=object)
バージョン 0.21 では、列の名前変更にいくつかの重要な更新がありました。
rename
メソッドに、またはaxis
に設定できるパラメータが追加されました。今回の更新により、このメソッドは pandas API の残りの部分と一致するようになりました。パラメータとパラメータはまだありますが、強制的に使用する必要はありません。columns
1
index
columns
set_axis
を使用すると、リストを使用してすべてのインデックスまたは列ラベルの名前を変更できます。inplace
False
サンプル DataFrame を構築します。
df = pd.DataFrame({'$a':[1,2], '$b': [3,4],
'$c':[5,6], '$d':[7,8],
'$e':[9,10]})
$a $b $c $d $e
0 1 3 5 7 9
1 2 4 6 8 10
rename
と一緒に使用するaxis='columns'
axis=1
df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis='columns')
また
df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis=1)
どちらも次の結果になります。
a b c d e
0 1 3 5 7 9
1 2 4 6 8 10
古いメソッド シグネチャを使用することも可能です。
df.rename(columns={'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'})
このrename
関数は、各列名に適用される関数も受け入れます。
df.rename(lambda x: x[1:], axis='columns')
また
df.rename(lambda x: x[1:], axis=1)
set_axis
とinplace=False
set_axis
列 (またはインデックス) の数と同じ長さのリストをメソッドに指定できます。現在、inplace
デフォルトはTrue
ですが、将来のリリースではinplace
デフォルトになる予定です。False
df.set_axis(['a', 'b', 'c', 'd', 'e'], axis='columns', inplace=False)
また
df.set_axis(['a', 'b', 'c', 'd', 'e'], axis=1, inplace=False)
df.columns = ['a', 'b', 'c', 'd', 'e']
ですか?このように列を直接割り当てても問題はありません。それは完全に良い解決策です。
使用する利点はset_axis
、メソッド チェーンの一部として使用できることと、DataFrame の新しいコピーを返すことです。これがないと、列を再割り当てする前に、チェーンの中間ステップを別の変数に保存する必要があります。
# 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()
使用する:
old_names = ['$a', '$b', '$c', '$d', '$e']
new_names = ['a', 'b', 'c', 'd', 'e']
df.rename(columns=dict(zip(old_names, new_names)), inplace=True)
このようにして、必要に応じて手動で編集できnew_names
ます。スペルミスやアクセントを修正したり、特殊文字を削除したりするために、いくつかの列の名前だけを変更する必要がある場合に最適です。
舞台裏で何が起こっているのかを少し説明したいと思います。
データフレームは一連のシリーズです。
シリーズは、 a の拡張ですnumpy.array
。
numpy.array
s にはプロパティがあります.name
。
これがシリーズの名前です。Pandas がこの属性を尊重することはめったにありませんが、場所に残り、Pandas の動作をハッキングするために使用できます。
ここでの多くの回答は、実際には であるdf.columns
属性が であると述べています。これは、属性を持っていることを意味します。list
Series
.name
列の名前を入力すると、次のようになりますSeries
。
df.columns = ['column_one', 'column_two']
df.columns.names = ['name of the list of columns']
df.index.names = ['name of the index']
name of the list of columns column_one column_two
name of the index
0 4 1
1 5 2
2 6 3
インデックスの名前は常に 1 列下になることに注意してください。
属性は.name
時々残ります。設定df.columns = ['one', 'two']
するdf.one.name
と になります'one'
。
を設定した場合df.one.name = 'three'
でもdf.columns
、 が提供['one', 'two']
され、 が提供されdf.one.name
ます'three'
。
pd.DataFrame(df.one)
戻ります
three
0 1
1 2
2 3
Pandas.name
は既に定義されている を再利用するためSeries
です。
Pandas には、複数層の列名を作成する方法があります。それほど多くの魔法は関係ありませんが、ここでこれを取り上げる人がいないので、これも私の回答でカバーしたかったのです。
|one |
|one |two |
0 | 4 | 1 |
1 | 5 | 2 |
2 | 6 | 3 |
これは、次のように列をリストに設定することで簡単に実現できます。
df.columns = [['one', 'one'], ['one', 'two']]
小さな例で名前の変更を理解しましょう...
マッピングを使用した列の名前変更:
df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]}) # Creating a df with column name A and B
df.rename({"A": "new_a", "B": "new_b"}, axis='columns', inplace =True) # Renaming column A with 'new_a' and B with 'new_b'
Output:
new_a new_b
0 1 4
1 2 5
2 3 6
マッピングを使用して index/Row_Name の名前を変更する:
df.rename({0: "x", 1: "y", 2: "z"}, axis='index', inplace =True) # Row name are getting replaced by 'x', 'y', and 'z'.
Output:
new_a new_b
x 1 4
y 2 5
z 3 6
実にシンプルです。使用するだけです:
df.columns = ['Name1', 'Name2', 'Name3'...]
また、列名は、入力した順序で割り当てられます。
そのために使用できますstr.slice
:
df.columns = df.columns.str.slice(1)
別のオプションは、正規表現を使用して名前を変更することです。
import pandas as pd
import re
df = pd.DataFrame({'$a':[1,2], '$b':[3,4], '$c':[5,6]})
df = df.rename(columns=lambda x: re.sub('\$','',x))
>>> df
a b c
0 1 3 5
1 2 4 6
私の方法は一般的なもので、変数をカンマで区切ることで区切り記号を追加し、delimiters=
それを将来的に証明することができます。
作業コード:
import pandas as pd
import re
df = pd.DataFrame({'$a':[1,2], '$b': [3,4],'$c':[5,6], '$d': [7,8], '$e': [9,10]})
delimiters = '$'
matchPattern = '|'.join(map(re.escape, delimiters))
df.columns = [re.split(matchPattern, i)[1] for i in df.columns ]
出力:
>>> df
$a $b $c $d $e
0 1 3 5 7 9
1 2 4 6 8 10
>>> df
a b c d e
0 1 3 5 7 9
1 2 4 6 8 10
以前の回答のアプローチは、 MultiIndexでは機能しないことに注意してください。MultiIndexの場合、次のようなことを行う必要があります。
>>> df = pd.DataFrame({('$a','$x'):[1,2], ('$b','$y'): [3,4], ('e','f'):[5,6]})
>>> df
$a $b e
$x $y f
0 1 3 5
1 2 4 6
>>> rename = {('$a','$x'):('a','x'), ('$b','$y'):('b','y')}
>>> df.columns = pandas.MultiIndex.from_tuples([
rename.get(item, item) for item in df.columns.tolist()])
>>> df
a b e
x y f
0 1 3 5
1 2 4 6