Зміна конкретного імені стовпця в пандах 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)
Докстринг:
Змініть індекс та / або стовпці, використовуючи функцію введення або
функції. Значення функції / дікта повинні бути унікальними (від 1 до 1). Мітки немає
що міститься в диктаті / Серії, буде залишено як є.

Параметри
----------
індекс: подібна чи функція, необов'язкова
    Перетворення для застосування до значень індексу
стовпці: схожий на малюнок або функцію, необов’язково
    Перетворення для застосування до значень стовпців
копія: булева, за замовчуванням - True
    Також скопіюйте основні дані
inplace: булева, за замовчуванням False
    Чи повертати новий DataFrame. Якщо True, то значення копії -
    ігнорується.

Дивитися також
--------
Серія.назва

Повертається
-------
перейменований: DataFrame (новий об’єкт)

Це не працює для мене, якщо я не використовую inplace = True, як показано у відповіді @ Jeong-Yoon Lee.
JStrahl

108

Оскільки inplaceаргумент доступний, вам не потрібно копіювати та присвоювати оригінальний кадр даних назад самому собі, а зробити наступне:

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

39

А як на рахунок?

df.columns.values[2] = "new_name"

11
насправді це не працює, якщо пізніше ви використовуєте назву стовпця для інших операцій, наприклад, у df ['new_name']
Master

4
ця відповідь була корисною для мене, щоб змінити конкретний стовпець на нове ім’я. 1-й стовпець - це індекс 0, 2-й стовпчик - індекс 1 тощо. приємне рішення .. і я впевнений, що це допоможе більшості людей .. так як інші рішення вимагають, щоб ви заздалегідь знали і скопіювали оригінальні назви стовпців .... в той час як це швидкий і брудний метод .. який має свої цілі.
ihightower

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'}, ось = 'стовпці') Throws TypeError: Неможливо вказати і «ось», і будь-який з «індексу» або «стовпців».
Ось тут

@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'можете ви розширити це.
Nirmal

2

версії панд 0.23.4

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

Для запису:

опущення індексу = str дасть помилку заміни має несподіваний аргумент "стовпці"


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