Я ищу эффективный способ удаления ненужных частей из строк в столбце DataFrame.
Данные выглядят так:
time result
1 09:00 +52A
2 10:00 +62B
3 11:00 +44a
4 12:00 +30b
5 13:00 -110a
Мне нужно обрезать эти данные до:
time result
1 09:00 52
2 10:00 62
3 11:00 44
4 12:00 30
5 13:00 110
Я пробовал .str.lstrip('+-')
и. str.rstrip('aAbBcC')
, но возникла ошибка:
TypeError: wrapper() takes exactly 1 argument (2 given)
Будем признательны за любые указатели!
Через 6 лет после того, как был опубликован исходный вопрос, у pandas теперь есть большое количество «векторизованных» строковых функций, которые могут кратко выполнять эти операции манипулирования строками.
В этом ответе будут рассмотрены некоторые из этих строковых функций, предложены более быстрые альтернативы и в конце будет проведено сравнение таймингов.
.str.replace
Укажите подстроку / шаблон для сопоставления и подстроку для замены.
Если вам нужно преобразовать результат в целое число, вы можете использовать
Series.astype
,Если вы не хотите изменять
df
на месте, используйтеDataFrame.assign
:.str.extract
Полезно для извлечения подстрок, которые вы хотите сохранить.
С
extract
необходимо указать хотя бы одну группу захвата.expand=False
вернет серию с захваченными элементами из первой группы захвата..str.split
и.str.get
Разделение работает при условии, что все ваши строки следуют этой согласованной структуре.
Не рекомендую, если вы ищете общее решение.
Оптимизация: составление списков
В некоторых случаях понимание списка должно быть предпочтительнее строковых функций pandas. Причина в том, что строковые функции по своей природе трудно векторизовать (в истинном смысле этого слова), поэтому большинство строковых и регулярных функций являются только оболочками вокруг циклов с большими накладными расходами.
Моя рецензия, действительно ли циклы for в пандах плохи? Когда мне нужно заботиться? , более подробно.
str.replace
Опция может быть переписана с использованиемre.sub
str.extract
Пример может быть переписан с использованием списка понимание сre.search
,Если возможны NaN или несоответствия, вам нужно будет переписать приведенное выше, чтобы включить проверку ошибок. Я делаю это с помощью функции.
Мы также можем переписать ответы @ eumiro и @ MonkeyButter, используя списки:
И,
Применяются те же правила для обработки NaN и т. Д.
Сравнение производительности
Графики, созданные с помощью perfplot . Полный список кодов для справки. Соответствующие функции перечислены ниже.
Некоторые из этих сравнений несправедливы, потому что они используют структуру данных OP, но извлекайте из нее все, что хотите. Следует отметить, что каждая функция понимания списка либо быстрее, либо сравнима, чем ее эквивалентный вариант pandas.
функции
источник
Try using .loc[row_indexer,col_indexer] = value instead
Я бы использовал функцию замены панд, очень простую и мощную, поскольку вы можете использовать регулярное выражение. Ниже я использую регулярное выражение \ D для удаления любых нецифровых символов, но, очевидно, вы можете проявить творческий подход с регулярным выражением.
источник
df.loc[:, 'column_a'].replace(regex=True, to_replace="my_prefix", value="new_prefix")
. Это преобразует строку типа «my_prefixaaa» в «new_prefixaaa».В конкретном случае, когда вы знаете количество позиций, которые вы хотите удалить из столбца фрейма данных, вы можете использовать строковое индексирование внутри лямбда-функции, чтобы избавиться от этих частей:
Последний персонаж:
Первые два персонажа:
источник
Здесь есть ошибка: в настоящее время нельзя передавать аргументы
str.lstrip
иstr.rstrip
:http://github.com/pydata/pandas/issues/2411
РЕДАКТИРОВАТЬ: 2012-12-07 теперь это работает в ветке dev:
источник
Очень простой метод - использовать этот
extract
метод для выбора всех цифр. Просто предоставьте ему регулярное выражение,'\d+'
извлекающее любое количество цифр.источник
Я часто использую составление списков для задач такого типа, потому что они часто быстрее.
Могут быть большие различия в производительности между различными методами для выполнения таких действий (т. Е. Изменения каждого элемента ряда в DataFrame). Часто понимание списка может быть самым быстрым - см. Гонку кода ниже для этой задачи:
источник
Предположим, ваш DF также имеет этот дополнительный символ между числами. Последняя запись.
Вы можете попробовать str.replace, чтобы удалить символы не только в начале и конце, но и между ними.
Вывод:
источник
Попробуйте это с помощью регулярного выражения:
источник