我正在尝试使用函数计算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中提出了类似的问题,但是给出的答案对我不起作用。
答案 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
进行操作