Як перейменувати певний стовпець у пандах?
Від 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()
Перший - більш природний і вільно текучий синтаксис.