У меня есть DataFrame, использующий панды и метки столбцов, которые мне нужно отредактировать, чтобы заменить оригинальные метки столбцов.
Я хотел бы изменить имена столбцов в DataFrame, A
где исходные имена столбцов:
['$a', '$b', '$c', '$d', '$e']
в
['a', 'b', 'c', 'd', 'e'].
У меня есть отредактированные имена столбцов, которые хранятся в списке, но я не знаю, как заменить имена столбцов.
Ответы:
Просто назначьте его
.columns
атрибуту:источник
new_columns = df.columns.values;
new_columns[0] = 'XX';
df.columns = new_columns
df.rename(columns = {'$b':'B'}, inplace = True)
ПЕРЕИМЕНОВАТЬ КОНКРЕТНЫЕ КОЛОННЫ
Используйте
df.rename()
функцию и укажите столбцы, которые нужно переименовать. Не все столбцы должны быть переименованы:Пример минимального кода
Следующие методы работают и выдают одинаковый результат:
Не забудьте присвоить результат обратно, так как модификация не на месте. В качестве альтернативы укажите
inplace=True
:Начиная с версии v0.25, вы также можете указать,
errors='raise'
чтобы вызывать ошибки, если указан неверный столбец для переименования. Смотрите документацию v0.25rename()
.ИЗМЕНИТЬ КОЛОННУ
использование
df.set_axis()
сaxis=1
иinplace=False
(чтобы вернуть копию).Это возвращает копию, но вы можете изменить DataFrame на месте, установив
inplace=True
(это поведение по умолчанию для версий <= 0,24, но, вероятно, изменится в будущем).Вы также можете назначить заголовки напрямую:
источник
code
<class 'pandas.core.frame.DataFrame'> Int64Index: 1000 записей, от 0 до 999 столбцов данных: BodyMarkdown 1000 не-nullcode
работает , но когда я делаю dataframe.head (), старые имена для столбцов снова появляются.SettingWithCopyWarning:
когда использую второй фрагмент кода в этом ответе.df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})
изменяет отображаемое имя, но не элементы в базовой структуре данных. Так что если вы попробуете,df['newName1']
вы получите ошибку.inplace=True
Необходимо избегать этого gotchya.rename
Метод может принимать функцию , например:источник
df.rename(columns=lambda x: x.lstrip(), inplace=True)
t.columns = t.columns.str.replace(r'[^\x00-\x7F]+','')
df.rename(columns=lambda x: x.replace(' ', '_'), inplace=True)
это драгоценный камень, так что мы можем писатьdf.Column_1_Name
вместо того, чтобы писатьdf.loc[:, 'Column 1 Name']
.Как описано в разделе Работа с текстовыми данными :
источник
Панды 0.21+ Ответ
Произошли некоторые существенные обновления переименования столбцов в версии 0.21.
rename
Метод был добавленaxis
параметр , который может быть установлен наcolumns
или1
. Это обновление делает этот метод соответствующим остальному API панд. Он по- прежнему имеетindex
иcolumns
параметры , но не больше не вынуждены использовать их.set_axis
Метод сinplace
набором дляFalse
позволяет переименовать всю индексную или столбцы метки со списком.Примеры для панд 0.21+
Построить образец DataFrame:
Использование
rename
сaxis='columns'
илиaxis=1
или
Оба приводят к следующему:
Еще можно использовать сигнатуру старого метода:
rename
Функция также принимает функцию , которые будут применены к каждому имени столбца.или
Использование
set_axis
со списком иinplace=False
Вы можете предоставить
set_axis
метод методу, длина которого равна числу столбцов (или индекса). В настоящее время поinplace
умолчанию используетсяTrue
, ноinplace
будет использоваться по умолчаниюFalse
в будущих выпусках.или
Почему бы не использовать
df.columns = ['a', 'b', 'c', 'd', 'e']
?Нет ничего плохого в том, чтобы напрямую присваивать столбцы. Это совершенно хорошее решение.
Преимущество использования
set_axis
заключается в том, что он может использоваться как часть цепочки методов и возвращает новую копию DataFrame. Без него вам пришлось бы сохранить промежуточные шаги цепочки в другой переменной перед переназначением столбцов.источник
Pandas 0.21+ answer
- почему-то я пропустил эту часть в части «Что нового» ...(df .groupby(['page',pd.Grouper(key='date',freq='MS')])['clicks'].sum() .unstack(1) .rename(lambda x: x.strftime("%Y-%m"), axis='columns') )
Поскольку вы хотите удалить только знак $ во всех именах столбцов, вы можете просто сделать:
ИЛИ
источник
Он заменит существующие имена на имена, которые вы предоставляете, в том порядке, в котором вы их указали.
источник
df.columns.values
, это неправильно. stackoverflow.com/questions/43291781/…Таким образом, вы можете вручную редактировать,
new_names
как вы хотите. Прекрасно работает, когда вам нужно переименовать только несколько столбцов, чтобы исправить неправильное написание, акценты, удалить специальные символы и т. Д.источник
df.columns = ['a', 'b', 'c', 'd', 'e']
проще.df.columns.values
чтобы получить старые имена.myList = list(df) myList[10:20]
и т. Д., Так что это идеально.namez = df.columns.values
затем выполнить некоторые правкиdf.columns = namez
.Одна линия или трубопроводные решения
Я сосредоточусь на двух вещах:
ОП четко заявляет
Я не хочу решать проблему замены
'$'
или удаления первого символа каждого заголовка столбца. ОП уже сделал этот шаг. Вместо этого я хочу сосредоточиться на замене существующегоcolumns
объекта новым, учитывая список имен замещающих столбцов.df.columns = new
гдеnew
список имен новых столбцов так же прост, как и получается. Недостаток этого подхода заключается в том, что он требует редактированияcolumns
атрибута существующего информационного кадра, и он не выполняется встраиваемым образом. Я покажу несколько способов сделать это с помощью конвейерной обработки, не редактируя существующий фрейм данных.Настройка 1
Чтобы сосредоточиться на необходимости переименования заменяемых имен столбцов в уже существующий список, я создам новый примерный кадр данных
df
с исходными именами столбцов и несвязанными новыми именами столбцов.Решение 1
pd.DataFrame.rename
Уже говорилось, что если бы у вас был словарь, сопоставляющий старые имена столбцов с новыми именами столбцов, вы могли бы использовать
pd.DataFrame.rename
.Тем не менее, вы можете легко создать этот словарь и включить его в вызов
rename
. Следующее использует тот факт, что при перебореdf
мы перебираем каждое имя столбца.Это прекрасно работает, если ваши оригинальные имена столбцов являются уникальными. Но если они не, то это ломается.
Настройка 2
неуникальных столбцов
Решение 2
pd.concat
с использованиемkeys
аргументаВо-первых, обратите внимание, что происходит, когда мы пытаемся использовать решение 1:
Мы не отображали
new
список как имена столбцов. Мы закончили тем, что повторилиy765
. Вместо этого мы можем использоватьkeys
аргументpd.concat
функции во время итерации по столбцамdf
.Решение 3
Реконструкция. Это следует использовать, только если у вас есть один
dtype
для всех столбцов. В противном случае вы получитеdtype
object
все столбцы, и для их преобразования требуется больше словарной работы.Один
dtype
смешанный
dtype
Решение 4
Это трюк с
transpose
иset_index
.pd.DataFrame.set_index
позволяет нам установить индекс в строке, но не соответствуетset_columns
. Таким образом, мы можем транспонироватьset_index
и перенести обратно. Тем не менее, тот же синглdtype
против смешанногоdtype
здесь применимо предостережение в из решения 3.Один
dtype
смешанный
dtype
Решение 5
Используйте a
lambda
вpd.DataFrame.rename
этом цикле через каждый элементnew
В этом решении мы передаем лямбду, которая принимает,
x
но затем игнорирует ее. Это также занимает,y
но не ожидает этого. Вместо этого итератор задан в качестве значения по умолчанию, и затем я могу использовать его для циклического перехода по одному за раз, независимо от значенияx
.И как отметили мне люди в чате sopython , если я добавлю
*
промежуточноеx
иy
, я смогу защитить своюy
переменную. Хотя в этом контексте я не верю, что это нуждается в защите. Это все еще стоит упомянуть.источник
df.rename(lambda x : x.lstrip('$'),axis=1)
x
, игнорируется?Имена столбцов и имена серий
Я хотел бы немного объяснить, что происходит за кулисами.
Датафреймы представляют собой набор Series.
Серия в свою очередь является продолжением
numpy.array
numpy.array
у собственности есть.name
Это название серии. Редко, когда панды уважают этот атрибут, но он задерживается в некоторых местах и может быть использован для взлома поведения некоторых панд.
Наименование списка столбцов
Много ответов здесь говорит о том, что
df.columns
атрибутом является,list
когда на самом деле этоSeries
. Это означает, что у него есть.name
атрибут.Вот что произойдет, если вы решите заполнить имя столбца
Series
:Обратите внимание, что имя индекса всегда на один столбец ниже.
Артефакты, которые задерживаются
.name
Атрибут бытует иногда. Если вы установите,df.columns = ['one', 'two']
тоdf.one.name
будет'one'
.Если вы установите,
df.one.name = 'three'
тоdf.columns
все равно даст вам['one', 'two']
, иdf.one.name
даст вам'three'
НО
pd.DataFrame(df.one)
вернусьПотому что панды повторно используют
.name
уже определенныеSeries
.Многоуровневые имена столбцов
У Панд есть способы создания многослойных имен столбцов. В этом не так много волшебства, но я хотел бы рассказать об этом и в своем ответе, так как я не вижу, чтобы кто-то здесь это понимал.
Этого легко достичь, установив столбцы в списки, например так:
источник
Если у вас есть датафрейм, df.columns выводит все в список, которым вы можете манипулировать, а затем переназначать в ваш фрейм данных как имена столбцов ...
Лучший способ? ИДК. Способ - да.
Ниже представлен лучший способ оценки всех основных приемов, предложенных в ответах на вопрос, с использованием cProfile для измерения памяти и времени выполнения. У @kadee, @kaitlyn, & @eumiro были функции с самым быстрым временем выполнения - хотя эти функции настолько быстры, что мы сравниваем округление в 0,000 и 0,001 секунды для всех ответов. Мораль: мой ответ выше, скорее всего, не самый лучший.
источник
Допустим, это ваш фрейм данных.
Вы можете переименовать столбцы двумя способами.
С помощью
dataframe.columns=[#list]
Ограничением этого метода является то, что если необходимо изменить один столбец, необходимо передать полный список столбцов. Кроме того, этот метод не применим к индексным меткам. Например, если вы передали это:
Это выдаст ошибку. Несоответствие длины: ожидаемая ось имеет 5 элементов, новые значения имеют 4 элемента.
Другим методом является метод Pandas,
rename()
который используется для переименования любого индекса, столбца или строки.Точно так же вы можете изменить любые строки или столбцы.
источник
Если ваш новый список столбцов находится в том же порядке, что и существующие столбцы, назначение простое:
Если у вас был словарь, связанный со старыми именами столбцов и новыми именами столбцов, вы могли бы сделать следующее:
Если у вас нет списка или словаря, вы можете удалить начальный
$
символ с помощью понимания списка:источник
lambda col: d[col]
вы могли пройтиd.get
... так это выглядело быdf.columns.map(d.get)
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rename.html
источник
Давайте разберемся с переименованием на небольшом примере ...
1. Переименование столбцов с помощью сопоставления:
2. Переименование индекса / Row_Name с использованием сопоставления:
источник
Другой способ, которым мы могли бы заменить исходные метки столбцов, - удалить ненужные символы (здесь «$») с оригинальных меток столбцов.
Это можно было сделать, запустив цикл for над df.columns и добавив раздетые столбцы в df.columns.
Вместо этого мы можем сделать это аккуратно в одном выражении, используя понимание списка, как показано ниже:
(
strip
метод в Python удаляет данный символ из начала и конца строки.)источник
Очень просто использовать
и он назначит имена столбцов в порядке их размещения
источник
Вы можете использовать
str.slice
для этого:источник
df.columns.str[1:]
... вероятно, лучше использовать это, это короче и более очевидно.Я знаю этот вопрос и ответ был разжеван до смерти. Но я обратился к нему за вдохновением для решения одной из моих проблем. Я был в состоянии решить это, используя кусочки от разных ответов, поэтому предоставил свой ответ на случай, если кому-то это понадобится.
Мой метод является общим, в котором вы можете добавить дополнительные разделители, разделяя запятую
delimiters=
и сохраняя ее в будущем.Рабочий код:
Вывод:
источник
Обратите внимание, что этот подход не работает для MultiIndex. Для MultiIndex вам нужно сделать что-то вроде следующего:
источник
Другой вариант - переименовать, используя регулярное выражение:
источник
Если вам приходится иметь дело с множеством столбцов, названных системой-поставщиком вне вашего контроля, я предложил следующий подход, который представляет собой комбинацию общего подхода и конкретных замен за один раз.
Сначала создайте словарь из имен столбцов данных, используя выражения регулярных выражений, чтобы отбросить определенные приложения имен столбцов, а затем добавьте конкретные замены в словарь для именования основных столбцов, как ожидается позже в принимающей базе данных.
Затем это применяется к кадру данных за один раз.
источник
В дополнение к уже предоставленному решению вы можете заменить все столбцы во время чтения файла. Мы можем использовать
names
иheader=0
сделать это.Сначала мы создаем список имен, которые мы хотели бы использовать в качестве имен столбцов:
В этом случае все имена столбцов будут заменены именами, которые есть в вашем списке.
источник
Вот изящная маленькая функция, которую я люблю использовать, чтобы сократить ввод текста:
Вот пример того, как это работает:
источник
Переименование столбцов в пандах - это простая задача.
источник
Предполагая, что вы можете использовать регулярное выражение. Это решение устраняет необходимость ручного кодирования с использованием регулярных выражений
источник