Переименование заголовка одного столбца в фрейме данных 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 ответов
гораздо быстрее реализация будет использовать 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()