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

у меня есть фрейм данных под названием data. Как переименовать только один заголовок столбца? Например gdp to 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

3 ответов


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

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

см. Также по теме


гораздо быстрее реализация будет использовать 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

Панды 0.21+ Ответ

там были некоторые значительные обновления для переименования столбцов в версии 0.21.

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

примеры для панд 0.21+

построить образец фрейма данных:

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 заключается в том, что он может использоваться как часть цепочки методов и возвращает новую копию фрейма данных. Без него вам придется хранить промежуточные шаги цепочки в другой переменной перед переназначением столбцы.

# 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()