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)我必须如何修改调用才能获得所需的数据帧?
笔记
在此链接中提出了类似的问题,但给出的答案对我不起作用。
对于行来说,答案似乎也不正确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']))
Run Code Online (Sandbox Code Playgroud)
欲了解详细信息,请点击链接