Pandas DataFrame.assign参数

Pandas DataFrame.assign参数,pandas,Pandas,问题 如何使用assign返回添加了多个新列的原始数据帧的副本 期望的结果 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 1

问题

如何使用
assign
返回添加了多个新列的原始数据帧的副本

期望的结果

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:传递的项目数错误2,放置意味着1

背景

Pandas中的
assign
功能获取连接到新分配列的相关数据帧的副本,例如

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
此函数的值表示可以向数据帧添加多个列

可以在同一分配中分配多个列,但不能引用在同一分配调用中创建的其他列

此外:

参数:
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

通过将每个新列作为关键字参数提供,可以创建多个列:

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

我认为文档应该更清楚地说明如何使用多个列来实现这一点,以避免使用提供的example@JJJ我拒绝了您的标记编辑,因为这个问题与python无关。参见meta上的相关帖子。到目前为止,这是我发现的将assign函数与带有空格的列名一起使用的唯一方法,因为,恕我直言,Python-kwargs不能使用它们。