当前位置: 首页 > 知识库问答 >
问题:

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

阎元徽
2023-03-14

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

计算步骤

正好使用三行

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

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) 如何修改调用以获得所需的数据帧?

笔记

在这个链接中,有人问了一个类似的问题,但是给出的答案对我不起作用。

共有1个答案

夏侯旻
2023-03-14

对于3行,答案似乎也不正确。除了第一行和第一列之外,您可以检查其他值吗?查看结果,20*5*2的乘积不是120,而是200,并放置在下面的列中。在分配给新列之前,您需要以正确的方式形成列表。您可以尝试使用以下设置新列:

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

有关详细信息,请点击链接

 类似资料:
  • 问题内容: 我如何使用JPA条件API执行以下操作: 使用CriteriaBuilder.countDistinct在一个列/路径上执行此操作很简单,但是如何在两个路径/列上执行此操作? 问题答案: 这是一个较晚的答案:-)尽管我不确定情况是否有所改变。 最近,我遇到了非常相同的需求,并使用concat解决了该需求,即通过将列连接为 伪列 ,然后将其连接到 伪列 上。 但是我不能使用,因为它生成了

  • 我有一个数据框架,我想从其中一列的列表中创建5列 示例: 请注意,这里很少有列表少于5列,对于这些列,请在该位置插入NAN。

  • 例如,假设我有一个 我有条件: 我如何测试条件并为我的df的每一行返回一个结果,如下面所示? 编辑:理想情况下,我想创建一个,允许我 并计算所有行的数据。因为在实际数据中,有100个条件语句和10个列。

  • 例如3x^4-17x^2-3x+5。多项式的每个项可以表示为一对整数(系数、指数)。然后,多项式本身是这样的对的列表,如 所示。 零多项式0表示为空列表,因为它没有具有非零系数的项。 我想写两个函数,用元组(系数、指数)的相同表示形式对两个输入多项式进行相加和相乘: null > 应该给出 应该给出 应该给出 这里有一些东西,我开始了,但完全被打动了!

  • 问题内容: 我是使用DataFrame的新手,我想知道如何在一系列表的多个列上执行等效于左外部联接的SQL 例: 本质上,我想做类似以下SQL代码的操作(注意df3在Year上没有加入): 结果应如下所示: 我曾尝试使用合并和联接,但无法弄清楚如何在多个表上以及涉及多个联接时执行此操作。有人可以帮我吗? 谢谢 问题答案: 合并他们在两个步骤,和第一,然后那到结果。 我从df3删除了year,因为您

  • 问题内容: 我编写了一个脚本,该脚本在用户每次登录我们域中的计算机时运行。此脚本记录用户以及他们登录的计算机。任意数量的用户可以登录任意数量的计算机。 我只是从一个不在的顾问那里继承了这个IT环境,并且正在编写这个小查询,因此当接到用户的呼叫时,我可以按该用户的名字进行搜索,并合理地预测该用户正在使用的计算机。他们登录到任何给定计算机的次数。 这是“登录”表中数据的示例: 我要敲定的逻辑是跨多个列