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

时间:2017-07-08 18:21:29

标签: pandas dataframe multiple-columns calculated-columns

我正在尝试使用函数计算pandas数据框中多列的多个列。 该函数接受三个参数-a-,-b-和-c-,并返回三个计算值-sum-,-prod-和-quot-。在我的pandas数据框中,我有三个coumns -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

这正是我想要的结果:sum-column具有a,b,c列中元素的总和; prod-column具有列a,b,c中元素的乘积,而quot-column具有列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中提出了类似的问题,但是给出的答案对我不起作用。

1 个答案:

答案 0 :(得分:2)

对于3行,答案似乎也不正确。您可以查看除first row and first column以外的其他值。查看结果,20*5*2的产品 120,它是200,位于sum列的下方。在分配新列之前,您需要以正确的方式形成列表。您可以尝试使用以下命令设置新列:

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

有关详情,请按照link

进行操作