如何从pandas中的多列计算多列

Pet*_*Dev 4 calculated-columns multiple-columns dataframe pandas

我正在尝试使用函数从 pandas 数据框中的多个列计算多个列。该函数采用三个参数 -a-、-b- 和 -c-,并返回三个计算值 -sum-、-prod- 和 -quot-。在我的 pandas 数据框中,我有三个列 -a-、-b- 和 -c-,我想从中计算列 -sum-、-prod- 和 -quot-。

我所做的映射仅在我恰好有三行时才有效。我不知道出了什么问题,尽管我希望它必须通过选择正确的轴来做一些事情。有人可以解释一下发生了什么以及我如何计算我想要的值。以下是我测试过的情况。

初始值

def sum_prod_quot(a,b,c):
    sum  = a + b + c
    prod = a * b * c
    quot = a / b / c
    return (sum, prod, quot)

df = pd.DataFrame({ 'a': [20, 100, 18],
                    'b': [ 5,  10,  3],
                    'c': [ 2,  10,  6],
                    'd': [ 1,   2,  3]
                 })

df
    a   b   c  d
0   20   5   2  1
1  100  10  10  2
2   18   3   6  3
Run Code Online (Sandbox Code Playgroud)

计算步骤

正好使用三行

当我从此数据帧计算三列并使用函数 function 时,我得到:

df['sum'], df['prod'], df['quot'] = \
        list( map(sum_prod_quot, df['a'], df['b'], df['c']))

df
     a   b   c  d    sum     prod   quot
0   20   5   2  1   27.0    120.0   27.0
1  100  10  10  2  200.0  10000.0  324.0
2   18   3   6  3    2.0      1.0    1.0
Run Code Online (Sandbox Code Playgroud)

这正是我想要的结果: sum 列包含 a、b、c 列中元素的总和;prod 列包含 a、b、c 列中元素的乘积,quot 列包含 a、b、c 列中元素的商。

使用三行以上

当我用一行扩展数据框时,出现错误!

数据框定义为:

df = pd.DataFrame({ 'a': [20, 100, 18, 40],
                    'b': [ 5,  10,  3, 10],
                    'c': [ 2,  10,  6,  4],
                    'd': [ 1,   2,  3,  4]
                 })
df
     a   b   c  d
0   20   5   2  1
1  100  10  10  2
2   18   3   6  3
3   40  10   4  4
Run Code Online (Sandbox Code Playgroud)

通话内容是

df['sum'], df['prod'], df['quot'] = \
        list( map(sum_prod_quot, df['a'], df['b'], df['c']))
Run Code Online (Sandbox Code Playgroud)

结果是

...
    list( map(sum_prod_quot, df['a'], df['b'], df['c']))
ValueError: too many values to unpack (expected 3) 
Run Code Online (Sandbox Code Playgroud)

虽然我希望有额外的一行:

df
     a   b   c  d    sum     prod   quot
0   20   5   2  1   27.0    120.0   27.0
1  100  10  10  2  200.0  10000.0  324.0
2   18   3   6  3    2.0      1.0    1.0
3   40  10   4  4   54.0   1600.0    1.0
Run Code Online (Sandbox Code Playgroud)

使用少于三行

当我用一行减少数据帧时,我也收到一个错误。数据框定义为:

df = pd.DataFrame({ 'a': [20, 100],
                    'b': [ 5,  10],
                    'c': [ 2,  10],
                    'd': [ 1,   2]
                 })
df
     a   b   c  d
0   20   5   2  1
1  100  10  10  2
Run Code Online (Sandbox Code Playgroud)

通话内容是

df['sum'], df['prod'], df['quot'] = \
        list( map(sum_prod_quot, df['a'], df['b'], df['c']))
Run Code Online (Sandbox Code Playgroud)

结果是

...
    list( map(sum_prod_quot, df['a'], df['b'], df['c']))
ValueError: need more than 2 values to unpack
Run Code Online (Sandbox Code Playgroud)

虽然我希望少一行:

df
     a   b   c  d    sum     prod   quot
0   20   5   2  1   27.0    120.0   27.0
1  100  10  10  2  200.0  10000.0  324.0
Run Code Online (Sandbox Code Playgroud)

问题

我有的问题:

1)为什么我会收到这些错误?

2)我必须如何修改调用才能获得所需的数据帧?

笔记

此链接中提出了类似的问题,但给出的答案对我不起作用。

stu*_*ent 7

对于行来说,答案似乎也不正确3。您可以检查除 之外的其他值吗first row and first column?查看结果, 的乘积20*5*2不是,而是和 放置在下面的 中。在分配给新列之前,您需要以正确的方式形成列表。您可以尝试使用以下命令来设置新列:120200sum

df['sum'], df['prod'], df['quot'] = zip(*map(sum_prod_quot, df['a'], df['b'], df['c']))
Run Code Online (Sandbox Code Playgroud)

欲了解详细信息,请点击链接

  • 这正是我正在寻找的线路。谢谢。它也可以与原始函数(放置在另一个模块中)一起使用,我需要从直角坐标计算极坐标。 (2认同)