Строковые методы (атрибуты атрибута .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)
в начале указывает механизму регулярных выражений на совпадение символов новой строки в любом случае. Мы хотим, чтобы после удаления были добавлены все символов, а не только все, кроме одного.