Изменение определенного имени столбца в панде DataFrame

195

Я искал элегантный способ изменить указанное имя столбца в DataFrame.

воспроизводить данные ...

import pandas as pd
d = {
         'one': [1, 2, 3, 4, 5],
         'two': [9, 8, 7, 6, 5],
         'three': ['a', 'b', 'c', 'd', 'e']
    }
df = pd.DataFrame(d)

Самое элегантное решение, которое я нашел до сих пор ...

names = df.columns.tolist()
names[names.index('two')] = 'new_name'
df.columns = names

Я надеялся на простой однострочник ... эта попытка не удалась ...

df.columns[df.columns.tolist().index('one')] = 'another_name'

Любые намеки с благодарностью получены.

Марк График
источник

Ответы:

355

Один лайнер существует:

In [27]: df=df.rename(columns = {'two':'new_name'})

In [28]: df
Out[28]: 
  one three  new_name
0    1     a         9
1    2     b         8
2    3     c         7
3    4     d         6
4    5     e         5

Ниже приведена строка документации для renameметода.

Определение: df.rename (self, index = None, столбцы = None, copy = True, inplace = False)
строка документации:
Изменить индекс и / или столбцы, используя функцию ввода или
функции. Значения функции / dict должны быть уникальными (1-к-1). Ярлыки не
содержащиеся в dict / Series останется как есть.

параметры
----------
index: dict-like или function, необязательный
    Преобразование для применения к значениям индекса
столбцы: dict-like или function, необязательный
    Преобразование для применения к значениям столбца
copy: логическое, по умолчанию True
    Также скопируйте основные данные
на месте: логическое, по умолчанию False
    Вернуть ли новый DataFrame. Если True, то значение копии равно
    игнорируются.

Смотрите также
--------
Series.rename

Возвращает
-------
переименован: DataFrame (новый объект)
Нипун Батра
источник
Это не работает для меня, если я не использую inplace = True, как показано в ответе @ Jeong-Yoon Lee.
JStrahl
109

Поскольку inplaceаргумент доступен, вам не нужно копировать и присваивать исходный фрейм данных обратно себе, но сделайте следующее:

df.rename(columns={'two':'new_name'}, inplace=True)
Чжон Юн Ли
источник
39

Что о?

df.columns.values[2] = "new_name"
Джейкоб Х
источник
11
на самом деле это не работает, если позже вы используете имя столбца в других операциях, как в df ['new_name']
Мастер Йогурт
4
этот ответ был полезен для меня, чтобы изменить конкретный столбец на новое имя. 1-й столбец - индекс 0, 2-й столбец - индекс 1 и т. Д. Хорошее решение ... и я уверен, что это поможет большему количеству людей ... поскольку другие решения требуют, чтобы вы знали и скопировали оригинальные имена столбцов заранее ... в то время как это быстрый и грязный метод ... который имеет свои собственные применения.
Высшая башня
1
@MasterYogurt ваш комментарий не верный. Это возможно выполнить df['new_name'](и другие вещи панды) после изменения переменных, как описано выше. Ваш комментарий мог быть действительным, когда он был первоначально опубликован.
Джейкоб Х
1
При этом использование renameметодов является лучшим решением.
Джейкоб Х
6

Панды 0.21 теперь имеют параметр оси

Метод переименования получил параметр оси, соответствующий большинству остальных API панд.

Итак, в дополнение к этому:

df.rename(columns = {'two':'new_name'})

Ты можешь сделать:

df.rename({'two':'new_name'}, axis=1)

или

df.rename({'two':'new_name'}, axis='columns')
Тед Петру
источник
df.rename ({'two': 'new_name'}, axis = 'columns') Бросает TypeError: Невозможно указать как 'axis', так и любой из 'index' или 'columns'.
Здесь
@HereHere Убедитесь, что вы используете версию 0.21 для панд. Не pd.__version__забудьте проверить свою версию
Тед Петру
5

Если вы знаете, какой это столбец # (первый / второй / n-й), то это решение, опубликованное по аналогичному вопросу, работает независимо от того, названо оно или нет, и в одну строку: https://stackoverflow.com/a/26336314/ 4355695

df.rename(columns = {list(df)[1]:'new_name'}, inplace=True)
# 1 is for second column (0,1,2..)
Нихил В.Ю.
источник
3

Для переименования столбцов здесь есть простой способ, который будет работать как для Default(0,1,2,etc;)существующих, так и для существующих столбцов, но не очень полезен для больших наборов данных (имеющих много столбцов).

Для большего набора данных мы можем нарезать столбцы, которые нам нужны, и применить следующий код:

df.columns = ['new_name','new_name1','old_name']
Навин Редди
источник
2

Следующий короткий код может помочь:

df3 = df3.rename(columns={c: c.replace(' ', '') for c in df3.columns})

Удалить пробелы из столбцов.

Эммануэль Масабо
источник
Я продолжал получать, AttributeError: 'int' object has no attribute 'replace'не могли бы вы расширить это?
Нирмал
2

версия панды 0.23.4

df.rename(index=str,columns={'old_name':'new_name'},inplace=True)

Для записи:

Пропуск index = str приведет к ошибке, замена имеет неожиданный аргумент 'columns'

Каллол Медхи
источник
1

Другим вариантом будет просто скопировать и удалить столбец:

df = pd.DataFrame(d)
df['new_name'] = df['two']
df = df.drop('two', axis=1)
df.head()

После этого вы получите результат:

    one three   new_name
0   1   a       9
1   2   b       8
2   3   c       7
3   4   d       6
4   5   e       5
Анка
источник
2
Этот метод не поможет, если важен порядок индексов столбцов. Новый столбец будет создан в конце.
Loochie