Вопрос:

Зачем использовать pandas.assign, а не просто инициализировать новый столбец?

python pandas

2329 просмотра

2 ответа

31720 Репутация автора

Я только что открыл assignметод для pandas dataframes, и он выглядит красиво и очень похоже на dplyr mutateв R. Тем не менее, я всегда справлялся, просто инициализируя новый столбец «на лету». Есть ли причина, почему assignлучше?

Например, (основываясь на примере в документации Pandas), чтобы создать новый столбец в кадре данных, я мог бы просто сделать это:

df = DataFrame({'A': range(1, 11), 'B': np.random.randn(10)})
df['ln_A'] = np.log(df['A'])

но pandas.DataFrame.assignдокументация рекомендует сделать это:

df.assign(ln_A = lambda x: np.log(x.A))
# or 
newcol = np.log(df['A'])
df.assign(ln_A=newcol)

Оба метода возвращают один и тот же кадр данных. Фактически, первый метод (мой метод «на лету») значительно быстрее (0,2025788200332318 секунд для 1000 итераций), чем .assignметод (0,3526602769998135 секунд для 1000 итераций).

Так есть ли причина, по которой я должен прекратить использовать мой старый метод в пользу df.assign?

Автор: sacuL Источник Размещён: 09.01.2018 11:01

Ответы (2)


9 плюса

13383 Репутация автора

Решение

Разница заключается в том, хотите ли вы изменить существующий фрейм или создать новый фрейм , сохранив при этом исходный фрейм.

В частности, DataFrame.assignвозвращает вам новый объект, который имеет копию исходных данных с запрошенными изменениями ... исходный фрейм остается неизменным .

В вашем конкретном случае:

>>> df = DataFrame({'A': range(1, 11), 'B': np.random.randn(10)})

Теперь предположим, что вы хотите создать новый фрейм, в котором Aвезде 1без разрушения df. Тогда вы могли бы использовать.assign

>>> new_df = df.assign(A=1)

Если вы не хотите поддерживать исходные значения, тогда явно df["A"] = 1подойдет больше. Это также объясняет разницу в скорости, по необходимости .assignнеобходимо копировать данные, а [...]не копировать .

Автор: donkopotamus Размещён: 09.01.2018 11:13

1 плюс

9036 Репутация автора

Предпосылка assignсостоит в том, что это возвращает:

Новый DataFrame с новыми столбцами в дополнение ко всем существующим столбцам.

А также вы не можете ничего сделать на месте, чтобы изменить исходный фрейм данных.

Вызываемый объект не должен изменять входной DataFrame (хотя pandas не проверяет его).

С другой стороны, все df['ln_A'] = np.log(df['A'])будет на месте.


Так есть ли причина, по которой я должен прекратить использовать мой старый метод в пользу df.assign?

Я думаю, что вы можете попробовать, df.assignно если вы делаете вещи , интенсивно использующие память , лучше работать с тем, что вы делали раньше или с операциями inplace=True.

Автор: prosti Размещён: 07.05.2019 12:58
Вопросы из категории :
32x32