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

How to calculate multiple columns from multiple columns in pandas

我正在尝试使用函数从 pandas 数据框中的多个列计算多个列。 该函数采用三个参数 -a-、-b- 和 -c- 以及 returns 三个计算值 -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

计算步骤

正好使用三行

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

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

这正是我想要的结果:求和列是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

来电是

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

结果是

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

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

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

使用少于三行

当我将数据帧减少一行时,我也得到了一个错误。 数据帧定义为:

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

来电是

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

结果是

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

虽然我希望少排:

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

问题

我的问题:

1) 为什么会出现这些错误?

2) 我如何修改调用以获得所需的数据帧?

注意

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

3 行的答案似乎也不正确。你能检查除 first row and first column 以外的其他值吗?查看结果,20*5*2 的乘积是 NOT 120,它是 200 并且放在下面的 sum 列中。在分配给新列之前,您需要以正确的方式形成列表。您可以尝试使用以下设置新列:

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

详情请关注link