【问题标题】:Pandas "countif" based on column value and multiindex基于列值和多索引的熊猫“countif”
【发布时间】: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 更好的方法来做到这一点,我们将不胜感激! :)

【问题讨论】:

    标签: python-3.x pandas group-by count


    【解决方案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()
    • 刚刚意识到我的错误 - 感谢您的快速回复!我真的很感激:)
    猜你喜欢
    • 2023-02-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    相关资源
    最近更新 更多