python - 使用多个查询对 Python 中的数据帧进行子集化

标签 python python-3.x pandas dataframe

对具有多列的数据帧进行子集化并查找与查询匹配的行数的最短方法是什么。

是否有更简单的方法来重写以下代码。

目标是找出所有季度均取得成绩的学生人数以及仅第四季度未取得成绩的学生人数。

resDataFrame = df[(df['6th-Grade-Q1'] == 'Y') & (df['6th-Grade-Q2'] == 'Y' ) &  (df['6th-Grade-Q3'] == 'Y') & (df['6th-Grade-Q4'] == 'Y') ]
numberOfStudents = len(resDataFrame.index)
resDataFrame = df[ (df['6th-Grade-Q1'] == 'Y') & (df['6th-Grade-Q2'] == 'Y' ) &  (df['6th-Grade-Q3'] == 'Y') & (df['6th-Grade-Q4'] == 'X') ]
numberOfStudentsMissed = len(resDataFrame.index)

最佳答案

您的第一行可以大大缩短,因为条件始终相同,并且列名称遵循某种模式:

df.filter(like='6th-Grade-Q').eq('Y').all(1).sum()

如果除了这 4 列之外,还有其他以 '6th-Grade-Q' 开头的列,请不要使用过滤器并在列表中显式指定这 4 列。对于第二个条件,您可以使用:

(df[['6th-Grade-Q1', '6th-Grade-Q2', '6th-Grade-Q3']].eq('Y').all(1) & df['6th-Grade-Q4'].eq('X')).sum()

由于您只需要计数,因此无需对原始 DataFrame 进行子集化,然后计算长度。只需将掩码的 True 值相加即可。


如果您想要一个更通用的解决方案来检查不遵循模式的列之间的相等条件之间的许多 & 运算符,那么请回退到 numpy。首先指定要检查为元组的列和相等性的列表:

import numpy as np
condlist = [('6th-Grade-Q1', 'Y'), ('6th-Grade-Q2', 'Y'),
            ('6th-Grade-Q3', 'Y'), ('6th-Grade-Q4', 'Y')]

np.logical_and.reduce([df[col].eq(val) for col,val in condlist]).sum()

关于python - 使用多个查询对 Python 中的数据帧进行子集化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54845617/

相关文章:

python - await 关键字如何工作?

python - socket.recvmsg 忽略 ancbufsize、辅助数据

python - 通过列表理解或映射加速 numpy 数组分配?

python - 为什么这个正则表达式不起作用?也许是因为双重回顾?

python - 如何防止 pandas 数据框中的索引显示在 Excel 中?

python - 对 Pandas 数据框中的元素进行排名

python - 从系列更改索引创建 Pandas 数据框

python - 找不到将模块导入 python

python - 属性错误 : 'int' object has no attribute 'sleep'

python - 保存和导出 python pandas 数据框的数据类型信息