Переименуйте заголовок одного столбца в фреймворк pandas

У меня есть dataframe под названием data. Как переименовать единственный заголовок столбца? Например, gdp - log(gdp)?

data =
    y  gdp  cap
0   1    2    5
1   2    3    9
2   8    7    2
3   3    4    7
4   6    7    7
5   4    8    3
6   8    2    8
7   9    9   10
8   6    6    4
9  10   10    7

Ответ 1

data.rename(columns={'gdp':'log(gdp)'}, inplace=True)

rename показывает, что он принимает dict как параметр для columns, поэтому вы просто передаете dict с одной записью.

Также см. .

Ответ 2

Более быстрая реализация заключалась бы в использовании list-comprehension, если вам нужно переименовать один столбец.

df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]

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

df.columns = ['log(gdp)' if x=='gdp' else 'cap_mod' if x=='cap' else x for x in df.columns]

Или постройте сопоставление с помощью dictionary и выполните операцию list-comprehension с ним get, установив значение по умолчанию в качестве старого имени:

col_dict = {'gdp': 'log(gdp)', 'cap': 'cap_mod'}   ## key→old name, value→new name

df.columns = [col_dict.get(x, x) for x in df.columns]

Тайминги:

%%timeit
df.rename(columns={'gdp':'log(gdp)'}, inplace=True)
10000 loops, best of 3: 168 µs per loop

%%timeit
df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]
10000 loops, best of 3: 58.5 µs per loop

Ответ 3

Pandas 0.21+ Отвечать

В версии 0.21 были внесены существенные обновления для переименования столбцов.

  • rename method добавил параметр axis, который может быть установлен на columns или 1. Это обновление позволяет этому методу соответствовать остальной части pandas API. Он по-прежнему имеет параметры index и columns, но вы больше не вынуждены их использовать.
  • set_index method с inplace, установленным в False, позволяет вам переименовать все метки индекса или столбца с помощью список.

Примеры для pandas 0.21 +

Построить образец DataFrame:

df = pd.DataFrame({'y':[1,2,8], 'gdp':[2,3,7], 'cap':[5,9,2]}, 
                  columns=['y','gdp', 'cap'])

   cap  gdp  y
0    5    2  1
1    9    3  2
2    2    7  8

Используя rename с axis='columns' или axis=1 (новый для 0.21)

df.rename({'gdp':'log(gdp)'}, axis='columns')

или

df.rename({'gdp':'log(gdp)'}, axis=1)

Оба результата приведут к следующему:

   cap  log(gdp)  y
0    5         2  1
1    9         3  2
2    2         7  8

По-прежнему можно использовать старую подпись метода:

df.rename(columns={'gdp':'log(gdp)'})

Функция rename также принимает функции, которые будут применяться к каждому имени столбца.

df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis='columns')

или

df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis=1)

Используя set_axis со списком и inplace=False

Вы можете предоставить список методу set_axis, равному по длине количеству столбцов (или индекса). В настоящее время inplace по умолчанию используется True, но inplace по умолчанию будет False в будущих выпусках.

df.set_axis(['cap', 'log(gdp)', 'y'], axis='columns', inplace=False)

или

df.set_axis(['cap', 'log(gdp)', 'y'], axis=1, inplace=False)

Почему бы не использовать df.columns = ['cap', 'log(gdp)', 'y']?

Нет ничего плохого в назначении столбцов прямо так. Это идеальное решение.

Преимущество использования set_axis заключается в том, что его можно использовать как часть цепочки методов и что он возвращает новую копию DataFrame. Без него вам нужно будет сохранить промежуточные шаги цепочки на другую переменную, прежде чем переназначать столбцы.

# new for pandas 0.21+
df.some_method1()
  .some_method2()
  .set_axis()
  .some_method3()

# old way
df1 = df.some_method1()
        .some_method2()
df1.columns = columns
df1.some_method3()

Ответ 4

Вы можете вызвать df.columns.str.replace.

df.columns = df.columns.str.replace('gdp', 'log(gdp)')
df

    y  log(gdp)  cap
0   1         2    5
1   2         3    9
2   8         7    2
3   3         4    7
4   6         7    7
5   4         8    3
6   8         2    8
7   9         9   10
8   6         6    4
9  10        10    7

Преимущество этого по сравнению с другими методами заключается в том, что вы также можете выполнять замену на основе regex:

df

   x1  y1  y2
0   1   2   5
1   2   3   9
2   8   7   2
3   3   4   7
4   6   7   7
5   4   8   3
6   8   2   8
7   9   9  10
8   6   6   4
9  10  10   7

df.columns = df.columns.str.replace(r'y(\d+)$', r'zzzz\1')
df

   x1  zzzz1  zzzz2
0   1      2      5
1   2      3      9
2   8      7      2
3   3      4      7
4   6      7      7
5   4      8      3
6   8      2      8
7   9      9     10
8   6      6      4
9  10     10      7