2487

元の列ラベルを置き換えるために編集する必要がある Pandas と列ラベルを使用する DataFrame があります。

A元の列名が次の DataFrame の列名を変更したいと思います。

['$a', '$b', '$c', '$d', '$e']

['a', 'b', 'c', 'd', 'e'].

編集した列名をリストに保存していますが、列名を置き換える方法がわかりません。

4

32 に答える 32

3801

特定の列の名前を変更

関数を使用して、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=1inplace=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
于 2012-07-06T01:48:15.147 に答える
2401

.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
于 2012-07-05T14:23:27.910 に答える
474

このメソッドは、次のように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)
于 2013-05-21T09:58:59.743 に答える
187

パンダ 0.21+ 回答

バージョン 0.21 では、列の名前変更にいくつかの重要な更新がありました。

  • renameメソッドに、またはaxisに設定できるパラメータが追加されました。今回の更新により、このメソッドは pandas API の残りの部分と一致するようになりました。パラメータとパラメータはまだありますが、強制的に使用する必要はありません。columns1indexcolumns
  • に設定されたメソッドset_axis使用すると、リストを使用してすべてのインデックスまたは列ラベルの名前を変更できます。inplaceFalse

Pandas 0.21+ の例

サンプル 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_axisinplace=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()
于 2017-10-24T13:39:15.317 に答える
75

使用する:

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ます。スペルミスやアクセントを修正したり、特殊文字を削除したりするために、いくつかの列の名前だけを変更する必要がある場合に最適です。

于 2015-05-21T17:48:33.580 に答える
39

列名とシリーズ名

舞台裏で何が起こっているのかを少し説明したいと思います。

データフレームは一連のシリーズです。

シリーズは、 a の拡張ですnumpy.array

numpy.arrays にはプロパティがあります.name

これがシリーズの名前です。Pandas がこの属性を尊重することはめったにありませんが、場所に残り、Pandas の動作をハッキングするために使用できます。

列のリストに名前を付ける

ここでの多くの回答は、実際には であるdf.columns属性が であると述べています。これは、属性を持っていることを意味します。listSeries.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']]
于 2016-09-29T12:30:40.073 に答える
33

小さな例で名前の変更を理解しましょう...

  1. マッピングを使用した列の名前変更:

     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
    
  2. マッピングを使用して 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
    
于 2020-03-08T05:35:42.127 に答える
16

実にシンプルです。使用するだけです:

df.columns = ['Name1', 'Name2', 'Name3'...]

また、列名は、入力した順序で割り当てられます。

于 2015-11-29T19:22:47.913 に答える
12

そのために使用できますstr.slice

df.columns = df.columns.str.slice(1)
于 2016-01-28T17:31:39.437 に答える
12

別のオプションは、正規表現を使用して名前を変更することです。

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
于 2018-07-07T02:07:23.993 に答える
11

私の方法は一般的なもので、変数をカンマで区切ることで区切り記号を追加し、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
于 2016-08-04T20:26:50.133 に答える
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
于 2016-08-29T21:27:20.727 に答える