Векторизация панд с функцией на частях колонны

1

Поэтому у меня есть dataframe, который выглядит примерно так:

df1 = pd.DataFrame([[1,2, 3], [5,7,8], [2,5,4]])
   0  1  2
0  1  2  3
1  5  7  8
2  2  5  4

Затем у меня есть функция, которая добавляет 5 к числу, называемому add5. Я пытаюсь создать новый столбец в df1 который добавляет 5 ко всем номерам в столбце 2, которые больше 3. Я хочу использовать вектографию, не применяемую, поскольку эта концепция будет расширена до набора данных с сотнями тысяч записи и скорость будут важны. Я могу сделать это без ограничения более 3:

df1['3'] = add5(df1[2])

Но моя цель - сделать что-то вроде этого:

df1['3'] = add5(df1[2]) if df1[2] > 3

Надеюсь, кто-то может указать мне в правильном направлении. Спасибо!

Теги:
pandas

1 ответ

2
Лучший ответ

С помощью Pandas функция, явно применяемая для каждой строки, обычно не может быть векторизована. Даже неявные циклы, такие как pd.Series.apply, скорее всего, будут неэффективными. Вместо этого вы должны использовать настоящие векторизованные операции, которые в значительной степени зависят от NumPy как от функциональности, так и от синтаксиса.

В этом случае вы можете использовать numpy.where:

df1[3] = np.where(df1[2] > 3, df1[2] + 5, df1[2])

Кроме того, вы можете использовать pd.DataFrame.loc в два этапа:

df1[3] = df1[2]
df1.loc[df1[2] > 3, 3] = df1[2] + 5

В каждом случае термин df1[2] > 3 создает булеву последовательность, которая затем используется для маскировки другой серии.

Результат:

print(df1)

   0  1  2   3
0  1  2  3   3
1  5  7  8  13
2  2  5  4   9
  • 0
    Поэтому я надеюсь расширить эту концепцию до функций, которые намного сложнее, чем просто добавление 5. Можно ли сделать что-то вроде np.where (df1 [2]> 3, add5 (df1 [2]), df1 [ 2])?
  • 0
    @JSolomonCulp, если это числовая функция, очень вероятно, что вы можете векторизовать ее. Короче говоря, я советую против гипотетических суждений. Если у вас есть сложный алгоритм, который вы изо всех сил пытаетесь векторизовать, это может быть хорошим вопросом, чтобы задать его отдельно .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню