Заменить строку из одного столбца в другом столбце - PullRequest
0 голосов
/ 20 мая 2019

Можно ли заменить строки из одного столбца соответствующими строками из других столбцов в кадре данных pandas, используя только методы pandas.Series.str? «Нет» - это приемлемый ответ, если он сопровождается версия панд и соответствующая часть документов.

Вот пример:

import pandas as pd
# version >= 0.19.2
df = pd.DataFrame(
    {
        'names': ['alice', 'bob', 'catherine', 'slagathor'],
        'hobbies': [
            'alice likes to knit',
            'bob likes to bowl',
            'plays with her cats',
            'slagathor burniates peasants for fun'
        ]
    }
)

def clean(df: pd.DataFrame) -> pd.Dataframe: ... # do the substitutions

assert all(
    clean(df).hobbies == pd.Series([
        'likes to knit',
        'likes to bowl',
        'plays with her cats',
        'burniates peasants for fun'
    ])
)

В этом случае я бы хотел опустить строки из столбца name из столбца hobbies, используя что-то вроде

df.hobbies.str.replace('(' + df.names + r'\s*)?', '')  # doesn't work

Пока что мне пришлось

import re
df['replaced'] = pd.Series(
    re.sub(f'^{df.names[i]} ?', '', df.hobbies[i]) for i in df.index
)  

как в ответе на Заменить значения из одного столбца другим столбцом Pandas DataFrame

1 Ответ

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

str.replace - это метод Series , поэтому его можно применять к каждому элементу конкретного столбца , но здесь невозможно сослаться на любой другой колонка.

Таким образом, вы должны импортировать re и использовать вместо него re.sub в функции применяется к каждой строке (так что эта функция может ссылаться на другие столбцы текущей строки).

Ваша задача может быть выполнена в одной инструкции:

df['replaced'] = df.apply(lambda row: re.sub(
    '^' + row.names + r'\s*', '', row.hobbies), axis=1)

Это решение работает быстрее, чем создание Series с для loop внутри и замените под колонкой впоследствии, потому что apply берет заботиться о цикле над DataFrame, чтобы применяемая функция отвечала только для генерации значения для текущей строки.

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

Кроме того, ваш код не будет работать, если индекс был другим чем последовательные числа, начиная с 0. Попробуйте, например, создать свой DataFrame с index=np.arange(1, 5) параметр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...