Pandas DataFrameインデックスの名前を変更


141

ヘッダーのないcsvファイルに、DateTimeインデックスを付けました。インデックスと列名の名前を変更したいのですが、df.rename()を使用すると、列名のみが名前変更されます。バグ?バージョン0.12.0を使用しています

In [2]: df = pd.read_csv(r'D:\Data\DataTimeSeries_csv//seriesSM.csv', header=None, parse_dates=[[0]], index_col=[0] )

In [3]: df.head()
Out[3]: 
                   1
0                   
2002-06-18  0.112000
2002-06-22  0.190333
2002-06-26  0.134000
2002-06-30  0.093000
2002-07-04  0.098667

In [4]: df.rename(index={0:'Date'}, columns={1:'SM'}, inplace=True)

In [5]: df.head()
Out[5]: 
                  SM
0                   
2002-06-18  0.112000
2002-06-22  0.190333
2002-06-26  0.134000
2002-06-30  0.093000
2002-07-04  0.098667

5
2017年にこの質問に来る人は、以下の回答をチェックしてrename_axis方法の非常に詳細な説明を確認してください。
Ted Petrou 2017年

3
そして、以下の全体の良い答えを読んで気にすることはできませんもののために、そして迅速な解決策はあるdf.rename_axis("Date", axis='index', inplace=True)ドキュメントごとにpandas.pydata.org/pandas-docs/stable/generated/...df.index.names = ['Date']
tommy.carstensen

回答:


236

このrenameメソッドは、インデックス値に適用されるインデックスのディクショナリを取ります
インデックスレベルの名前に名前を変更します。

df.index.names = ['Date']

これについて考える良い方法は、列とインデックスが同じタイプのオブジェクト(IndexまたはMultiIndex)であり、転置を介して2つを交換できることです。

インデックス名は列と同様の意味を持っているため、これは少し混乱します。そのため、いくつかの例を次に示します。

In [1]: df = pd.DataFrame([[1, 2, 3], [4, 5 ,6]], columns=list('ABC'))

In [2]: df
Out[2]: 
   A  B  C
0  1  2  3
1  4  5  6

In [3]: df1 = df.set_index('A')

In [4]: df1
Out[4]: 
   B  C
A      
1  2  3
4  5  6

インデックスで名前の変更を確認できます。これにより、 1を変更できます

In [5]: df1.rename(index={1: 'a'})
Out[5]: 
   B  C
A      
a  2  3
4  5  6

In [6]: df1.rename(columns={'B': 'BB'})
Out[6]: 
   BB  C
A       
1   2  3
4   5  6

レベル名を変更している間:

In [7]: df1.index.names = ['index']
        df1.columns.names = ['column']

注:この属性は単なるリストであり、リストの内包/マップとして名前を変更できます。

In [8]: df1
Out[8]: 
column  B  C
index       
1       2  3
4       5  6

2
すばらしい答えです。がなくても"inplace =True"df1.rename実際には何も変更されないことに注意してください。
サラ、

63

現在選択されている回答ではrename_axis、インデックスと列レベルの名前を変更するために使用できる方法については触れられていません。


パンダは、インデックスのレベルの名前を変更する際に、いくつかの癖があります。rename_axisインデックスレベル名を変更するために使用できる新しいDataFrameメソッドもあります。

DataFrameを見てみましょう

df = pd.DataFrame({'age':[30, 2, 12],
                       'color':['blue', 'green', 'red'],
                       'food':['Steak', 'Lamb', 'Mango'],
                       'height':[165, 70, 120],
                       'score':[4.6, 8.3, 9.0],
                       'state':['NY', 'TX', 'FL']},
                       index = ['Jane', 'Nick', 'Aaron'])

ここに画像の説明を入力してください

このDataFrameには、行と列のインデックスごとに1つのレベルがあります。行インデックスと列インデックスの両方に名前はありません。行インデックスレベルの名前を「names」に変更してみましょう。

df.rename_axis('names')

ここに画像の説明を入力してください

このrename_axisメソッドには、axisパラメーターを変更することで列レベルの名前を変更する機能もあります。

df.rename_axis('names').rename_axis('attributes', axis='columns')

ここに画像の説明を入力してください

一部の列でインデックスを設定すると、列名が新しいインデックスレベル名になります。元のDataFrameにインデックスレベルを追加してみましょう。

df1 = df.set_index(['state', 'color'], append=True)
df1

ここに画像の説明を入力してください

元のインデックスに名前がないことに注目してください。引き続き使用できますrename_axisが、インデックスレベルの数と同じ長さのリストを渡す必要があります。

df1.rename_axis(['names', None, 'Colors'])

ここに画像の説明を入力してください

を使用Noneして、インデックスレベル名を効果的に削除できます。


シリーズは同様に機能しますが、いくつかの違いがあります

3つのインデックスレベルを持つシリーズを作成しましょう

s = df.set_index(['state', 'color'], append=True)['food']
s

       state  color
Jane   NY     blue     Steak
Nick   TX     green     Lamb
Aaron  FL     red      Mango
Name: food, dtype: object

rename_axisDataFrameで行ったのと同じように使用できます

s.rename_axis(['Names','States','Colors'])

Names  States  Colors
Jane   NY      blue      Steak
Nick   TX      green      Lamb
Aaron  FL      red       Mango
Name: food, dtype: object

呼ばれるシリーズの下に追加のメタデータがあることに注意してください Name。DataFrameからSeriesを作成する場合、この属性は列名に設定されます。

文字列名をrenameメソッドに渡して変更できます

s.rename('FOOOOOD')

       state  color
Jane   NY     blue     Steak
Nick   TX     green     Lamb
Aaron  FL     red      Mango
Name: FOOOOOD, dtype: object

データフレームにはこの属性がなく、このように使用すると、実際には例外が発生します

df.rename('my dataframe')
TypeError: 'str' object is not callable

Pandas 0.21以前rename_axisは、インデックスと列の値の名前を変更するために使用できました。廃止予定なので、これを行わないでください


1
交換df1 = df.set_index(['state', 'color'], append=True)df1.rename_axis(['names', None, 'Colors'])ますか?
salhin 2017年

「ニック」の名前を「ニコラ」に変更したい場合はどうすればよいですか?それが「パンダインデックスの名前を変更」とググったときに私が探していたものであり、ここで終わりました。編集:まあ、受け入れられた答えはそれを説明しています、それは最初は私には明白ではありませんでした。
ベンファーマー

いいですね、これが連鎖割り当てで使用できる唯一の答えです!
IanS

19

新しいpandasバージョンの場合

df.index = df.index.rename('new name')

または

df.index.rename('new name', inplace=True)

後者は、データフレームがすべてのプロパティを保持する必要がある場合に必要です


18

Pandasバージョン0.13以降では、インデックスレベル名は不変(type FrozenList)であり、直接設定できなくなりました。最初にを使用Index.rename()して新しいインデックスレベル名をインデックスDataFrame.reindex()に適用し、次にを使用して新しいインデックスをDataFrameに適用する必要があります。例:

Pandasバージョン<0.13

df.index.names = ['Date']

Pandasバージョン> = 0.13

df = df.reindex(df.index.rename(['Date']))

9
違います!私のバージョンのPandas(0.13.1)では、df.index.names = ['foo']は正常に動作します!
LondonRob 14

5
@LondonRob-`df.index.names = ['foo']`もPandas 0.14で動作することに気づいていただきありがとうございます。どうやらそれは簡単に壊れただけで、私がテストしたときに含まれていました。
David Smith

1
どちらかindexまたはcolumn直接に名前を設定すると、(Pandas 0.19で)両方の名前が変更されますが、この方法では変更されません。
FooBar 2017

8

Index.set_names次のように使用することもできます。

In [25]: x = pd.DataFrame({'year':[1,1,1,1,2,2,2,2],
   ....:                   'country':['A','A','B','B','A','A','B','B'],
   ....:                   'prod':[1,2,1,2,1,2,1,2],
   ....:                   'val':[10,20,15,25,20,30,25,35]})

In [26]: x = x.set_index(['year','country','prod']).squeeze()

In [27]: x
Out[27]: 
year  country  prod
1     A        1       10
               2       20
      B        1       15
               2       25
2     A        1       20
               2       30
      B        1       25
               2       35
Name: val, dtype: int64
In [28]: x.index = x.index.set_names('foo', level=1)

In [29]: x
Out[29]: 
year  foo  prod
1     A    1       10
           2       20
      B    1       15
           2       25
2     A    1       20
           2       30
      B    1       25
           2       35
Name: val, dtype: int64

2
これは動作しmultiIndexますか? MultiIndex(levels=[['A', 'B', 'C', 'D', 'E', 'F'], ['Y', 'Z']], labels=[[0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5], [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]], names=['Portfolio', None])それは名前を変更することが可能となるNoneには measures
ctrl-alt-delete

2

列とインデックスの両方の名前を変更するために同じマッピングを使用したい場合は、次のようにすることができます。

mapping = {0:'Date', 1:'SM'}
df.index.names = list(map(lambda name: mapping.get(name, name), df.index.names))
df.rename(columns=mapping, inplace=True)

0
df.index.rename('new name', inplace=True)

私のために仕事をする唯一の人です(パンダ0.22.0)。
inplace = Trueがないと、私の場合、インデックスの名前は設定されません。


0

indexとのcolumns属性を使用できますpandas.DataFrame。注:リストの要素の数は、行/列の数と一致する必要があります。

#       A   B   C
# ONE   11  12  13
# TWO   21  22  23
# THREE 31  32  33

df.index = [1, 2, 3]
df.columns = ['a', 'b', 'c']
print(df)

#     a   b   c
# 1  11  12  13
# 2  21  22  23
# 3  31  32  33
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.