205

DateTime インデックスを持つ、ヘッダーのない csv ファイルがあります。インデックスとカラム名をリネームしたいのですが、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
4

9 に答える 9

328

この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
于 2013-11-08T04:19:28.283 に答える
19

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']))
于 2014-05-05T17:38:45.837 に答える
9

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
于 2015-09-08T12:28:07.067 に答える
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)
于 2016-10-06T10:29:03.307 に答える
1
df.index.rename('new name', inplace=True)

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

于 2018-02-19T16:27:14.383 に答える