Поэтому у меня есть 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 функция, явно применяемая для каждой строки, обычно не может быть векторизована. Даже неявные циклы, такие как 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