У меня есть DataFrame с данными анкеты.Баллы по некоторым ответам необходимо перевернуть для дальнейшего анализа.Итак, я хочу сделать следующее:
- Выберите строки с вопросами, в которых нужно инвертировать счет;
- Сопоставьте счет с новым счетом, используя словарь.
Все соответствующие столбцы в моем DataFrame - dtype
'категория'.Ниже я привел упрощенный пример того, что я пытаюсь выполнить:
import pandas as pd
# create a list of scores and a dictionary to invert the scores:
lst = ['u', 'v', 'w', 'x', 'y']
lst_rev = list(reversed(lst))
dct = dict(zip(lst, lst_rev))
# create the example dataframe:
df = pd.DataFrame({'A':['a', 'b', 'a', 'c', 'a'],
'B':lst},
dtype='category')
# create a list for selecting the specific rows that need to be remapped:
sel = ['b', 'c']
Первый метод
Первый метод, который я попробовал:
%timeit df['B'] = df.apply(lambda x: dct.get(x['B']) if x['A'] in sel else x['B'], axis=1)
дает следующий результат: 2.6 ms ± 36.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Второй метод
Второй метод был значительно медленнее (в моем наборе данных он показался намного хуже, чем предполагал этот тест):
mask = df['A'].isin(sel)
%timeit df.loc[mask, 'B'] = df.loc[mask, 'B'].map(dct)
выход: 3.56 ms ± 50.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Эти подходы работают, но оба работают довольно плохо на моем наборе данных.У кого-нибудь есть более быстрый метод?Заранее спасибо.