对具有多列的数据帧进行子集化并查找与查询匹配的行数的最短方法是什么。
是否有更简单的方法来重写以下代码。
目标是找出所有季度均取得成绩的学生人数以及仅第四季度未取得成绩的学生人数。
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/