基于列值和多索引的熊猫“countif”
Posted
技术标签:
【中文标题】基于列值和多索引的熊猫“countif”【英文标题】:Pandas "countif" based on column value and multiindex 【发布时间】:2018-07-15 14:11:33 【问题描述】:我有一个如下所示的 DataFrame:
我有YEAR
和RACEETHN
作为multiindex
。我想计算每个列变量的每个 YEAR
和 RACEETHN
组合的“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”的主要内容,如果未能解决你的问题,请参考以下文章