Как выполнить str.strip в dataframe и сохранить его с помощью inplace = true? - PullRequest
0 голосов
/ 08 мая 2019

У меня есть датафрейм с n столбцами.И я хочу выполнить полосу для строк в одном из столбцов в кадре данных.Мне удалось это сделать, но я хочу, чтобы это изменение отразилось на исходном фрейме данных.

Фрейм данных: данные

         Name

0        210123278414410005
1        101232784144610006
2        210123278414410007
3        21012-27841-410008
4        210123278414410009



After stripping:

         Name
0        10005
1        10006
2        10007
3        10008
4        10009
5        10010

Я попробовал приведенный ниже код, и полоса прошла успешно

data['Name'].str.strip().str[13:]

Однако, если я проверяю фрейм данных, полоса не отражается.

Я ищу что-то вроде параметра inplace.

Ответы [ 5 ]

2 голосов
/ 08 мая 2019

Строковые методы (атрибуты атрибута .str в серии) будут только когда-либо возвращать новую серию, вы не можете использовать их для изменений на месте. Единственный вариант - присвоить его тому же столбцу:

data['Name'] = data['Name'].str.strip().str[13:]

Вместо этого вы можете использовать Series.replace() метод с регулярным выражением и inplace=True:

data['Name'].replace(r'(?s)\A\s*(.{,13}).*(?<!\s)\s*\Z', r'\1', regex=True, inplace=True)

Приведенное выше регулярное выражение соответствует до 13 символов после начального пробела и игнорирует конечные пробелы и любые другие символы за пределами первых 13 после удаления пробела. Он выдает тот же результат, что и .str.strip().str[:13], но вносит изменения на месте.

В шаблоне используется отрицательный взгляд, чтобы убедиться, что окончательный шаблон \s* соответствует всем элементам пробела в конце, прежде чем выбрать от 0 до 13 символов того, что осталось. Якоря \A и \Z позволяют сопоставить всю строку, а (?s) в начале переключает шаблон . (точка, любой символ, кроме символов новой строки), чтобы включить новые строки при сопоставлении; таким образом, входное значение, такое как ' foo\nbar ', обрабатывается правильно.

Другими словами, шаблоны \A\s* и (?<!\s)\s*\Z действуют так же, как str.strip(), сопоставляя все пробелы в начале и конце соответственно и не более. Шаблон (.{,13)).* соответствует всем промежуточным элементам, причем первые 13 символов из них (или меньше, если после разметки не хватает символов для сопоставления) фиксируются как группа. Эта одна группа затем используется в качестве значения замены.

И поскольку . обычно не совпадает с \n символами, флаг (?s) в начале указывает механизму регулярных выражений на совпадение символов новой строки в любом случае. Мы хотим, чтобы после удаления были добавлены все символов, а не только все, кроме одного.

1 голос
/ 08 мая 2019

Я согласен с другими ответами о том, что для функции полосы нет никакого параметра inplace, как видно из документации для str.strip.

Чтобы добавить к этому: я нашел функции str для Панд, которые обычно используются при выборе определенных строк. Как df[df['Name'].str.contains('69'). Я бы сказал, что это возможная причина того, что у него нет параметра inplace - он не должен быть полностью «автономным», как rename или drop.

Также, чтобы добавить! Я думаю, что более питоническое решение - использовать вместо этого отрицательные индексы:

data['Name'] = data['Name'].str.strip().str[-5:]

Таким образом, нам не нужно предполагать, что имеется 18 символов, и / или мы будем последовательно получать «последние 5 символов»!

1 голос
/ 08 мая 2019

data['Name'].str.strip().str[13:] возвращает вам новый преобразованный столбец, но он не меняет данные на месте (внутри фрейма данных). Вы должны написать:

data['Name'] = data['Name'].str.strip().str[13:]

для записи преобразованных данных в столбец Name.

0 голосов
/ 08 мая 2019

Интересно отметить, что DataFrames панд работают на numpy ниже. Есть также идея сделать вещательные операции в numpy.

Вот пример, который я имел в виду:

import numpy as np
import pandas as pd

df=pd.DataFrame([['210123278414410005', '101232784144610006']])
dfn=df.to_numpy(copy=False) #numpy array
df=pd.DataFrame(np.frompyfunc(lambda dfn: dfn[13:],1,1)(dfn) )

print(df) #10005  10006

Это не отвечает на ваш вопрос, но это просто еще один вариант (хотя он создает новую таблицу данных из массива numpy).

0 голосов
/ 08 мая 2019

Согласно комментарию yatu: вам следует переназначить серию с вычеркнутыми значениями в исходный столбец.

data['Name'] = data['Name'].str.strip().str[13:]
...