基于列值和多索引的熊猫“countif”

Posted

技术标签:

【中文标题】基于列值和多索引的熊猫“countif”【英文标题】:Pandas "countif" based on column value and multiindex 【发布时间】:2018-07-15 14:11:33 【问题描述】:

我有一个如下所示的 DataFrame:

我有YEARRACEETHN 作为multiindex。我想计算每个列变量的每个 YEARRACEETHN 组合的“1”值的数量(注意,数据不仅是 0 和 1,所以我不能求和)。

我可以通过这样做来计算每列的 value = 1:

(df_3.ACSUPPSV == 1).sum()
(df_3.PSEDSUPPSV == 1).sum()

我想使用groupby 执行此操作,但无法使其正常工作。我尝试了以下代码来测试我是否可以在单个列 'ACSUPPSV' 上执行此操作,但它没有工作:

df.groupby(['YEAR', 'RACEETHN']).loc[df.ACSUPPSV == 1, 'ACSUPPSV'].count()

我将数据导出到 excel 并能够使用快速“COUNTIF”公式进行计算,但我知道在 pandas 中必须有一种方法可以做到这一点 - 来自 excel 的结果如下所示:

如果有人有比导出到 Excel 更好的方法来做到这一点,我们将不胜感激! :)

【问题讨论】:

【参考方案1】:

我认为您只需要 agg 和自定义函数来计数 1

df_3 = pd.DataFrame('ACSUPPSV':[1,1,1,1,0,1],
                   'PSEDSUPPSV':[1,1,0,1,0,0],
                   'BUDGETSV':[1,0,1,1,1,0],
                   'YEAR':[2000,2000,2001,2000,2000,2000],
                   'RACEETHN':list('aaabbb')).set_index(['YEAR','RACEETHN'])

print (df_3)

               ACSUPPSV  BUDGETSV  PSEDSUPPSV
YEAR RACEETHN                                
2000 a                1         1           1
     a                1         0           1
2001 a                1         1           0
2000 b                1         1           1
     b                0         1           0
     b                1         0           0

df2 = df_3.groupby(['YEAR', 'RACEETHN']).agg(lambda x: (x == 1).sum())
print (df2)
               ACSUPPSV  BUDGETSV  PSEDSUPPSV
YEAR RACEETHN                                
2000 a                2         1           2
     b                2         2           1
2001 a                1         1           0

旧答案:

df_3[((df_3.ACSUPPSV == 1) & (df_3.PSEDSUPPSV == 1))].groupby(['YEAR', 'RACEETHN']).size()

df_3.query('ACSUPPSV == 1 & PSEDSUPPSV == 1').groupby(['YEAR', 'RACEETHN']).size()

更笼统的:

cols = ['ACSUPPSV','PSEDSUPPSV']
df_3[(df_3[cols] == 1).all(axis=1)].groupby(['YEAR', 'RACEETHN']).size()

对于所有列:

df_3[(df_3 == 1).all(axis=1)].groupby(['YEAR', 'RACEETHN']).size()

编辑:

或者可能需要:

df_3.groupby(['YEAR', 'RACEETHN']).agg(lambda x: (x == 1).sum())

【讨论】:

缺少 df :-) 谢谢!有什么方法可以让我快速分别对每个列名进行计算,而不必逐个写出来?所以'ACSUPPSV''PSEDSUPPSV''BUDGETSV'等等...... 还有一个问题 - 如果我想满足两个条件,例如:df_3.groupby(['YEAR', 'RACEETHN']).agg(lambda x: (x == 1 or x = = 0).sum())。这显然行不通,但如果我希望条件为 1 或 0 怎么办? 使用((x == 1) | (x == 0)).sum(),但最好是多个或使用(x.isin([0,1]) ).sum() 刚刚意识到我的错误 - 感谢您的快速回复!我真的很感激:)

以上是关于基于列值和多索引的熊猫“countif”的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫中使用具有多索引的地图?

如何更改熊猫数据框中多索引的外层索引?

在熊猫数据框上设置多索引的最佳方法

具有可迭代对象的字典字典到具有多索引的可迭代对象索引的熊猫数据框

熊猫添加更高级别的列多索引

在熊猫中交换/排序多索引列