Удалить подстроку префикса (или суффикса) из заголовков столбцов в pandas

Я пытаюсь удалить подстроку _x, которая находится в конце части имен моих столбцов df.

Пример кода ДФ:

import pandas as pd

d = {'W_x': ['abcde','abcde','abcde']}
df = pd.DataFrame(data=d)

df['First_x']=[0,0,0]
df['Last_x']=[1,2,3]
df['Slice']=['abFC=0.01#%sdadf','12fdak*4%FC=-0.035faf,dd43','FC=0.5fasff']

выход:

     W_x  First_x Last_x                 Slice
0  abcde      0     1                   abFC=0.01
1  abcde      0     2  12fdak*4%FC=-0.035faf,dd43
2  abcde      0     3                 FC=0.5fasff

Желаемый результат:

       W  First  Last                       Slice
0  abcde      0     1                   abFC=0.01
1  abcde      0     2  12fdak*4%FC=-0.035faf,dd43
2  abcde      0     3                 FC=0.5fasff
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
30
0
45 840
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

питон <3,9, панды <1,4

Используйте str.strip/rstrip:

# df.columns = df.columns.str.strip('_x')
# Or, 
df.columns = df.columns.str.rstrip('_x')  # strip suffix at the right end only.

df.columns
# Index(['W', 'First', 'Last', 'Slice'], dtype='object')

Чтобы избежать проблемы, отмеченной в комментариях:

Beware of strip() if any column name starts or ends with either _ or x beyond the suffix.

Вы можете использовать str.replace,

df.columns = df.columns.str.replace(r'_x$', '')

df.columns
# Index(['W', 'First', 'Last', 'Slice'], dtype='object')

Обновление: питон >= 3.9, панды >= 1.4

Начиная с версии 1.4 вы скоро сможете использовать str.removeprefix/str.removesuffix.

Примеры:

s = pd.Series(["str_foo", "str_bar", "no_prefix"])
s
0    str_foo
1    str_bar
2    no_prefix
dtype: object

s.str.removeprefix("str_")
0    foo
1    bar
2    no_prefix
dtype: object
s = pd.Series(["foo_str", "bar_str", "no_suffix"])
s
0    foo_str
1    bar_str
2    no_suffix
dtype: object

s.str.removesuffix("_str")
0    foo
1    bar
2    no_suffix
dtype: object

Обратите внимание, что версия 1.4 еще не вышла, но вы можете поиграть с этой функцией, установив файл среда разработки панд.

Как и в случае с другим ответом, остерегайтесь strip(), если имя любого столбца начинается или заканчивается на _ или x после суффикса.

FabienP 14.04.2019 22:19

@FabienP, если это проблема, str.replace был бы идеальным выбором с шаблоном «_x $».

cs95 15.04.2019 08:00

Конечно, я думаю, что это можно рекламировать в вашем ответе.

FabienP 15.04.2019 08:21

Спасибо за ответ! Что означают 'r' и '$' в r'_x$'? Регулярное выражение и точное совпадение?

TheEconomist 18.05.2021 02:50

@TheEconomist r — это необработанный строковый литерал, а $ соответствует концу строки.

cs95 18.05.2021 08:16
df.columns = [col[:-2] for col in df.columns if col[-2:]=='_x' else col]

или

df.columns = [col.replace('_x', '') for col in df.columns]

Второй подход заменит каждое вхождение, даже если имя столбца «Last_xmas_x» будет Lastmas

Quickbeam2k1 14.04.2019 22:28

Я бы предложил использовать функцию rename:

df.rename(columns = lambda x: x.strip('_x'))

Выход по желанию

Вы также можете позаботиться о комментарии FabienP и изменить его в соответствии с решением Quang Hoang:

df.rename(columns = lambda x: x.replace('_x$', ''))

дает желаемый результат.

Другое решение простое:

df.rename(columns = lambda x: x[:-2] if x.endswith('_x') else x)

Остерегаться! Могут возникнуть проблемы, если имя столбца содержит либо _, либо x в начале или в конце, помимо суффикса _x...

FabienP 14.04.2019 22:14

Интересно: знаете почему? наличие имени столбца, такого как Last_x_y, ничего не удаляет, но Last_x_ и Last_x_x удаляются до Last.

Quickbeam2k1 14.04.2019 22:26

@FabienP, что ты предлагаешь вместо этого?

Quickbeam2k1 14.04.2019 22:30

Это связано с тем, что strip удаляет любые вхождения предоставленных символов с обоих концов строки. Он рассматривает не шаблон, а последовательность символов. Вероятно, replace является более конкретным, или какое-то использование split. Например, rsplit('_', 1)[0], который был бы более гибким, чем замена, если суффикс меняется, но не содержит более одного подчеркивания.

FabienP 14.04.2019 22:42
Ответ принят как подходящий

Обычно я использую способ @cs95, но просто для удобства оборачиваю его в метод фрейма данных:

import pandas as pd

def drop_prefix(self, prefix):
    self.columns = self.columns.str.lstrip(prefix)
    return self

pd.core.frame.DataFrame.drop_prefix = drop_prefix

Затем вы можете использовать его как обратный метод, уже реализованный в пандах add_prefix:

pd.drop_prefix('myprefix_')

Подобное использование lstrip может удалить некоторые символы, например, «myprefix_mean». lstrip('myprefix_') вернет «an» вместо вероятно ожидаемого «mean». Как и другие, предложенные в других комментариях, в этом случае, вероятно, лучше заменить.

Emanuele Fumagalli 19.06.2020 15:42
Добавлен Python 3.9removeprefix/removesuffix. Есть проблема с добавлением их в pandas str ops. Все, пожалуйста, зайдите на github.com/pandas-dev/pandas/issues/36944 и проголосуйте.
Casimir 29.08.2021 19:28

В Python 3.9+ вы можете использовать строковые методы removesuffix() и removeprefix() следующим образом:

df.columns = df.rename(columns = lambda x: x.removesuffix('_x')) # or any suffix per say
df.columns = df.rename(columns = lambda x: x.removeprefix('prefix_i_want_to_remove')) 

Или вы можете напрямую сопоставить столбцы как:

df.columns = df.columns.map(lambda x: x.removesuffix('_x')) # or any suffix per say
df.columns = df.columns.map(lambda x: x.removeprefix('prefix_i_want_to_remove')) 

У меня был аналогичный запрос, мне нужно было убрать префикс для заголовков столбцов. В моем случае префиксы имели такой шаблон: 'p1-', 'p2-', 'p3-' и так далее, поэтому я использую следующий фрагмент, чтобы удалить их все:

df.columns.str.replace(r'[a-z][0-9]*-','')

Python=3.8 и панды=1.3:

Используйте df.columns = df.columns.str.replace('_x',''), чтобы избавиться от суффикса.

Это работает хорошо и удаляет только точную подстроку (суффикс) '_x' из имен столбцов, в отличие от str.strip/str.rstrip(substring), который удаляет все символы, упомянутые в substring, из имен столбцов DataFrame независимо от того, присутствует ли полная подстрока в имени столбца или нет, последовательность, в которой встречаются эти символы, и т. д.

Другие вопросы по теме