Перейменуйте індекс DataFrame Pandas


142

У мене файл 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методу.
Тед Петру

3
А для тих, кому не можна заважати читати всю хорошу відповідь нижче, тоді швидке рішення - df.rename_axis("Date", axis='index', inplace=True)це відповідно до документації pandas.pydata.org/pandas-docs/stable/generated/… абоdf.index.names = ['Date']
tommy.carstensen

Відповіді:


237

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
Чудова відповідь. Просто ніжне нагадування про те , що без "inplace =True", df1.renameне реально змінити що - небудь.
Сара

63

На даний момент обрана відповідь не згадує rename_axisметод, який можна використовувати для перейменування рівнів індексу та стовпців.


Панда має певну химерність, коли йдеться про перейменування рівнів індексу. Також доступний новий метод 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

До панд 0,21 ви могли rename_axisперейменувати значення в індексі та стовпцях. Вона застаріла, тому не робіть цього


1
Якщо ви помінятися df1 = df.set_index(['state', 'color'], append=True)з df1.rename_axis(['names', None, 'Colors'])?
сальхін

Що робити, якщо я хочу перейменувати "Ніка" на "Ніколя"? Це те, що я шукав, коли я гуглив "перейменувати індекс панд" і опинився тут. EDIT: О, чекайте, прийнята відповідь пояснює це, спочатку це просто не було очевидно.
Бен Фармер

Приємно, це єдина відповідь, яку можна використовувати у прикутих завданнях!
IanS

19

Для новіших pandasверсій

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

або

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

Останнє потрібно, якщо кадр даних повинен зберігати всі свої властивості.


18

У версіях Pandas 0.13 і вище імена рівня індексу незмінні (тип 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

5
Дякуємо, що помітили, що @LondonRob - `df.index.names = ['foo']` також працює для мене з Pandas 0.14. Мабуть, це було порушено лише коротко і включено, коли я його тестував.
Девід Сміт

1
Встановлення імен для indexабо columnбезпосередньо, і для мене змінюється (на Pandas 0.19), але не за допомогою цього методу.
FooBar

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 = Істинно, в моєму випадку ім’я індексу не встановлено.


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.