如何从 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
我正在尝试使用函数从 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