如何使用熊猫对与给定条件匹配的列中的值求和?

Posted

技术标签:

【中文标题】如何使用熊猫对与给定条件匹配的列中的值求和?【英文标题】:How do I sum values in a column that match a given condition using pandas? 【发布时间】:2015-03-29 22:52:43 【问题描述】:

假设我有一个这样的列:

a   b  
1   5   
1   7
2   3
1   3
2   5

我想总结b 的值,例如a = 1。这会给我5 + 7 + 3 = 15

如何在 pandas 中做到这一点?

【问题讨论】:

【参考方案1】:

这里的基本思想是选择要求和的数据,然后对它们求和。可以通过多种不同的方式选择数据,其中一些如下所示。

布尔索引

可以说,选择值的最常用方法是使用Boolean indexing。

使用此方法,您可以找出“a”列等于1 的位置,然后对“b”列的相应行求和。您可以使用loc 来处理行和列的索引:

>>> df.loc[df['a'] == 1, 'b'].sum()
15

布尔索引可以扩展到其他列。例如,如果df 还包含一个列“c”,并且我们想要对“b”中的行求和,其中“a”为 1,“c”为 2,我们会这样写:

df.loc[(df['a'] == 1) & (df['c'] == 2), 'b'].sum()

查询

另一种选择数据的方法是使用query过滤您感兴趣的行,选择列'b'然后求和:

>>> df.query("a == 1")['b'].sum()
15

同样,该方法可以扩展为对数据进行更复杂的选择:

df.query("a == 1 and c == 2")['b'].sum()

请注意,这比布尔索引方法更简洁。

分组方式

另一种方法是使用groupby根据'a'列中的值将DataFrame分成几部分。然后,您可以对每个部分求和并提取 1 相加的值:

>>> df.groupby('a')['b'].sum()[1]
15

这种方法可能比使用布尔索引要慢,但如果您想检查列 a 中其他值的总和,它会很有用:

>>> df.groupby('a')['b'].sum()
a
1    15
2     8

【讨论】:

.b 部分是什么?你是如何索引这样的列的? 您可以通过编写df['a']df.a 来访问DataFrame 的a 列。第二个很方便,但如果列名包含多个单词(例如“person id”),或者列名与 DataFrame 方法(例如“where”或“sum”)一致,则效果不佳。 好的,谢谢,我如何将列中的所有值转换为int,从而使我能够对它们求和?我使用map 将它们全部转换为ints,但我认为pandas 中可能有一个内置函数可以更有效地执行此操作。 您可以写 df['a'] = df['a'].astype(int)df['a'] = df['a'].convert_objects(convert_numeric=True) 来做到这一点。 @LucSpan:当然,你可以写df.loc[(df['a'] == 1) & (df['c'] == 2), 'b'].sum() 来求和。【参考方案2】:

您也可以在不使用 groupby 或 loc 的情况下执行此操作。通过简单地在代码中包含条件。让数据框的名称为 df。那你可以试试:

df[df['a']==1]['b'].sum()

或者你也可以试试:

sum(df[df['a']==1]['b'])

另一种方法是使用 python 的 numpy 库:

import numpy as np
print(np.where(df['a']==1, df['b'],0).sum())

【讨论】:

以上是关于如何使用熊猫对与给定条件匹配的列中的值求和?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL:根据在另一个表中给定条件的列中找到的值插入

如何使用熊猫从另一个数据框 B 的列中删除包含特定数量值的数据框 A 中的行?

如何从包含文本的熊猫数据框中的列中提取年份(或日期时间)

如何从熊猫数据框中的列中删除字符串值

如何将熊猫系列的列值转换为Python中的列表?

如何在 if-else 条件下的列中使用 Spark 值 - Scala