Pandas DataFrameで特定の列名を変更する


195

で指定された列名を変更するエレガントな方法を探していましたDataFrame

データを再生する...

import pandas as pd
d = {
         'one': [1, 2, 3, 4, 5],
         'two': [9, 8, 7, 6, 5],
         'three': ['a', 'b', 'c', 'd', 'e']
    }
df = pd.DataFrame(d)

これまでに見つけた最もエレガントなソリューション...

names = df.columns.tolist()
names[names.index('two')] = 'new_name'
df.columns = names

私はシンプルなワンライナーを期待していました...この試みは失敗しました...

df.columns[df.columns.tolist().index('one')] = 'another_name'

感謝して受け取ったヒント。

回答:


355

ワンライナーは存在します:

In [27]: df=df.rename(columns = {'two':'new_name'})

In [28]: df
Out[28]: 
  one three  new_name
0    1     a         9
1    2     b         8
2    3     c         7
3    4     d         6
4    5     e         5

以下は、renameメソッドのdocstringです。

定義:df.rename(self、index = None、columns = None、copy = True、inplace = False)
Docstring:
入力関数を使用してインデックスや列を変更するか、
関数。関数/辞書の値は一意である必要があります(1対1)。ないラベル
辞書/シリーズに含まれているままになります。

パラメーター
----------
index:dictのようなまたは関数、オプション
    インデックス値に適用する変換
列:dictのようなまたは関数、オプション
    列の値に適用する変換
コピー:ブール値、デフォルトはTrue
    基礎となるデータもコピーする
inplace:ブール値、デフォルトはFalse
    新しいDataFrameを返すかどうか。Trueの場合、コピーの値は
    無視されました。

こちらもご覧ください
--------
Series.rename

戻り値
-------
名前が変更されました:DataFrame(新しいオブジェクト)

@ Jeong-Yoon Leeの返信に示されているようにinplace = Trueを使用しない限り、これは機能しません。
JStrahl

108

inplace引数を使用できるので、元のデータフレームをコピーしてそれ自体に割り当てる必要はありませんが、次のようにします。

df.rename(columns={'two':'new_name'}, inplace=True)

39

どうですか?

df.columns.values[2] = "new_name"

11
後でdf ['new_name']のような他の操作で列名を使用する場合、実際には機能しません
マスターヨーグルト

4
この回答は、特定の列を新しい名前に変更するのに役立ちました。最初の列はインデックス0、2番目の列はインデックス1、以下同様です。他の解決策では元の列名を事前に知ってコピーする必要があるので、これはより多くの人々に役立つと確信しています。
ihightower 2017

1
@MasterYogurtあなたのコメントは正しくありません。df['new_name']上で概説したように変数を変更した後に実行することができます(および他のパンダのこと)コメントは、最初に投稿された時点では有効だった可能性があります。
Jacob H

1
そうは言っても、renameメソッドを使用する方がより良いソリューションです。
Jacob H

6

Pandas 0.21に軸パラメーターが追加されました

renameメソッドは、その他のパンダAPIのほとんどと一致する軸パラメーターを取得しました。

したがって、これに加えて:

df.rename(columns = {'two':'new_name'})

できるよ:

df.rename({'two':'new_name'}, axis=1)

または

df.rename({'two':'new_name'}, axis='columns')

df.rename({'two': 'new_name'}、axis = 'columns')スローTypeError: 'axis'と 'index'または 'columns'のいずれも指定できません。
HereHere 2017

@HereHereパンダバージョン0.21を使用していることを確認してください。やるpd.__version__あなたのバージョンを確認するために
テッドPetrou

5

#(最初/ 2番目/ n番目)の列がわかっている場合、同様の質問に投稿されたこのソリューションは、名前付きか名前なしかに関係なく、1行で機能します:https : //stackoverflow.com/a/26336314/ 4355695

df.rename(columns = {list(df)[1]:'new_name'}, inplace=True)
# 1 is for second column (0,1,2..)

3

ここで列の名前を変更するのは、Default(0,1,2,etc;)既存の列の両方で機能する単純なものですが、より大きなデータセット(列が多い)ではあまり役に立ちません。

より大きなデータセットの場合、必要な列をスライスして、以下のコードを適用できます。

df.columns = ['new_name','new_name1','old_name']

2

以下の短いコードが役立ちます:

df3 = df3.rename(columns={c: c.replace(' ', '') for c in df3.columns})

列からスペースを削除します。


AttributeError: 'int' object has no attribute 'replace'はあなたにそれを拡大してもらい続けました。
ノーマル

2

パンダバージョン0.23.4

df.rename(index=str,columns={'old_name':'new_name'},inplace=True)

記録のために:

index = strを省略すると、予期しない引数 'columns'を持つエラー置換が発生します。


1

別のオプションは、単に列をコピー&ドロップすることです:

df = pd.DataFrame(d)
df['new_name'] = df['two']
df = df.drop('two', axis=1)
df.head()

その後、結果を取得します。

    one three   new_name
0   1   a       9
1   2   b       8
2   3   c       7
3   4   d       6
4   5   e       5

2
列インデックスの順序が重要な場合、この方法は役に立ちません。最後に新しい列が作成されます。
Loochie
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.