Переименовать 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
Ответы
Ответ 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)
Последнее требуется, если кадр данных должен сохранять все его свойства.