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.
- The
renameметод добавилaxisпараметр, который может быть установлен вcolumnsили1. Это обновление делает этот метод соответствует остальной части API pandas. Он все еще имеетindexиcolumnsпараметры, но вы больше не вынуждены использовать их.- The
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()
Comments