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
Другие вопросы по тегам