Я пытаюсь удалить подстроку _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






Используйте 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')
Начиная с версии 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 еще не вышла, но вы можете поиграть с этой функцией, установив файл среда разработки панд.
@FabienP, если это проблема, str.replace был бы идеальным выбором с шаблоном «_x $».
Конечно, я думаю, что это можно рекламировать в вашем ответе.
Спасибо за ответ! Что означают 'r' и '$' в r'_x$'? Регулярное выражение и точное совпадение?
@TheEconomist r — это необработанный строковый литерал, а $ соответствует концу строки.
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
Я бы предложил использовать функцию 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...
Интересно: знаете почему? наличие имени столбца, такого как Last_x_y, ничего не удаляет, но Last_x_ и Last_x_x удаляются до Last.
@FabienP, что ты предлагаешь вместо этого?
Это связано с тем, что strip удаляет любые вхождения предоставленных символов с обоих концов строки. Он рассматривает не шаблон, а последовательность символов. Вероятно, replace является более конкретным, или какое-то использование split. Например, rsplit('_', 1)[0], который был бы более гибким, чем замена, если суффикс меняется, но не содержит более одного подчеркивания.
Обычно я использую способ @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». Как и другие, предложенные в других комментариях, в этом случае, вероятно, лучше заменить.
removeprefix/removesuffix. Есть проблема с добавлением их в pandas str ops. Все, пожалуйста, зайдите на github.com/pandas-dev/pandas/issues/36944 и проголосуйте.
В 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 независимо от того, присутствует ли полная подстрока в имени столбца или нет, последовательность, в которой встречаются эти символы, и т. д.
Как и в случае с другим ответом, остерегайтесь
strip(), если имя любого столбца начинается или заканчивается на_илиxпосле суффикса.