Как переименовать определенный столбец в пандах?
От v0.24 +, чтобы переименовать один (или более) столбцов за один раз,
Если вам нужно переименовать ВСЕ столбцы одновременно,
DataFrame.set_axis()
метод с axis=1
. Передайте последовательность, подобную списку. Опции доступны и для модификации на месте.
rename
с участием axis=1
df = pd.DataFrame('x', columns=['y', 'gdp', 'cap'], index=range(5))
df
y gdp cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
С 0.21+ вы можете теперь указать axis
параметр с rename
:
df.rename({'gdp':'log(gdp)'}, axis=1)
# df.rename({'gdp':'log(gdp)'}, axis='columns')
y log(gdp) cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
(Обратите внимание, что rename
по умолчанию это не на месте, поэтому вам нужно будет вернуть результат обратно .)
Это дополнение было сделано для улучшения согласованности с остальной частью API. Новый axis
аргумент аналогичен columns
параметру - они делают то же самое.
df.rename(columns={'gdp': 'log(gdp)'})
y log(gdp) cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
rename
также принимает обратный вызов, который вызывается один раз для каждого столбца.
df.rename(lambda x: x[0], axis=1)
# df.rename(lambda x: x[0], axis='columns')
y g c
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
Для этого конкретного сценария вы хотели бы использовать
df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis=1)
Подобно replace
методу строк в python, pandas Index и Series (только объект dtype) определяют (векторизованный) str.replace
метод для замены на основе строк и регулярных выражений.
df.columns = df.columns.str.replace('gdp', 'log(gdp)')
df
y log(gdp) cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
Преимущество этого перед другими методами в том, что str.replace
поддерживает регулярные выражения (по умолчанию включено). Смотрите документы для получения дополнительной информации.
Передача списка set_axis
сaxis=1
Вызов set_axis
со списком заголовков. Длина списка должна быть равна размеру столбцов / индексов. set_axis
по умолчанию изменяет исходный DataFrame, но вы можете указать, inplace=False
возвращать ли измененную копию.
df.set_axis(['cap', 'log(gdp)', 'y'], axis=1, inplace=False)
# df.set_axis(['cap', 'log(gdp)', 'y'], axis='columns', inplace=False)
cap log(gdp) y
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
Примечание: в будущих выпусках по inplace
умолчанию будет True
.
Цепочка методов
Зачем выбирать, set_axis
когда у нас уже есть эффективный способ назначения столбцов df.columns = ...
? Как показал Тед Петру в [этом ответе], ( https://stackoverflow.com/a/46912050/4909087 ) 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()
Первый более естественный и свободно распространяемый синтаксис.