Pandas DataFrame.assign аргументы
ВОПРОС
Как может 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
1 ответ
Вы можете создать несколько столбцов, указав каждый новый столбец в качестве аргумента ключевого слова:
df = df.assign(C=df['A']**2, D=df.B*2)
Я получил ваш пример словаря для работы, распаковав словарь в качестве аргументов ключевых слов, используя **
:
df = df.assign(**{'C': df.A.apply(lambda x: x ** 2), 'D': df.B * 2})
Это похоже на assign
должен иметь возможность взять словарь, но в настоящее время он не поддерживается на основе исходного кода, который вы разместили.
Полученный результат:
A B C D
0 1 11 1 22
1 2 12 4 24
2 3 13 9 26
3 4 14 16 28