Вопрос
Как assign
можно использовать для возврата копии исходного DataFrame с добавлением нескольких новых столбцов?
ЖЕЛАТЕЛЬНЫЙ РЕЗУЛЬТАТ
df = pd.DataFrame({'A': range(1, 5), 'B': range(11, 15)})
>>> df.assign({'C': df.A.apply(lambda x: x ** 2), 'D': df.B * 2})
A B C D
0 1 11 1 22
1 2 12 4 24
2 3 13 9 26
3 4 14 16 28
ПОПЫТКИ
Приведенный выше пример приводит к:
ValueError: Wrong number of items passed 2, placement implies 1
.
ПРЕДПОСЫЛКИ
Функция assign
в Pandas принимает копию соответствующего фрейма данных, соединенного с вновь назначенным столбцом, например
df = df.assign(C=df.B * 2)
>>> df
A B C
0 1 11 22
1 2 12 24
2 3 13 26
3 4 14 28
0.19.2 документация для этой функции подразумевает, что к кадру данных можно добавить более одного столбца.
Назначение нескольких столбцов в одном и том же назначении возможно, но вы не можете ссылаться на другие столбцы, созданные в одном и том же вызове назначения.
Кроме того:
Параметры:
kwargs: ключевое слово, пары значенийключевые слова - это имена столбцов.
Исходный код для функции утверждает, что он принимает словарь:
def assign(self, **kwargs):
"""
.. versionadded:: 0.16.0
Parameters
----------
kwargs : keyword, value pairs
keywords are the column names. If the values are callable, they are computed
on the DataFrame and assigned to the new columns. If the values are not callable,
(e.g. a Series, scalar, or array), they are simply assigned.
Notes
-----
Since ``kwargs`` is a dictionary, the order of your
arguments may not be preserved. The make things predicatable,
the columns are inserted in alphabetical order, at the end of
your DataFrame. Assigning multiple columns within the same
``assign`` is possible, but you cannot reference other columns
created within the same ``assign`` call.
"""
data = self.copy()
# do all calculations first...
results = {}
for k, v in kwargs.items():
if callable(v):
results[k] = v(data)
else:
results[k] = v
# ... and then assign
for k, v in sorted(results.items()):
data[k] = v
return data