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