Переименовать Pandas Индекс DataFrame - программирование
Подтвердить что ты не робот

Переименовать Pandas Индекс DataFrame

У меня есть файл 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
4b9b3361

Ответ 1

Метод rename принимает словарь для индекса, который применяется к значениям индекса.
Вы хотите переименовать имя индекса:

df.index.names = ['Date']

Хороший способ подумать о том, что столбцы и индекс являются одним и тем же типом объекта (Index или MultiIndex), и вы можете поменять их на два транспонирования.

Это немного запутанно, так как имена индексов имеют одинаковое значение для столбцов, поэтому вот еще несколько примеров:

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

В Pandas версии 0.13 и выше имена индекса не изменяются (тип FrozenList) и больше не могут быть установлены напрямую. Вы должны сначала использовать Index.rename(), чтобы применить новые индексы к индексу, а затем использовать DataFrame.reindex() для применения нового индекса к DataFrame. Примеры:

Для Pandas версии < 0,13

df.index.names = ['Date']

Для Pandas version >= 0.13

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

Ответ 3

Вы также можете использовать 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

Ответ 4

В текущем выбранном ответе не упоминается метод rename_axis, который можно использовать для переименования уровней индекса и столбца.


Pandas имеет некоторую причудливость, когда дело доходит до переименования уровней индекса. Существует также новый метод DataFrame rename_axis, доступный для изменения имен индекса.

Посмотрим на 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 имеет один уровень для каждого индекса строки и столбца. Оба индекса строки и столбца не имеют имени. Позвольте изменить имя уровня индекса строки на "имена".

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 для эффективного удаления имен индекса.


Серии работают аналогично, но с некоторыми отличиями

Создайте серию с тремя уровнями индекса

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_axis аналогично тому, как мы это делали с DataFrames

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 этот атрибут устанавливается на имя столбца.

Мы можем передать имя строки методу rename, чтобы изменить его

s.rename('FOOOOOD')

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

DataFrames не имеет этого атрибута, и infact будет вызывать исключение, если оно используется как

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

До pandas 0.21 вы могли бы использовать rename_axis для переименования значений в индексе и столбцах. Он устарел, поэтому не делайте этого

Ответ 5

Если вы хотите использовать одно и то же отображение для переименования столбцов и индекса, вы можете:

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)

Ответ 6

Для более новых версий pandas

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

или

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

Последнее требуется, если кадр данных должен сохранять все его свойства.