如何统计符合筛选条件的行数并为Pandas DataFrame添加尝试次数列?
嘿,我来帮你搞定这两个Pandas需求!先把咱们的数据再明确下(我调整了数字格式,避免Python语法报错):
import pandas as pd general = pd.DataFrame( columns=["code","grade","year","quarter","subject"], data=[[1,4.5,2011,1,1],[1,5.0,2012,2,1],[23,5.0,2013,1,2],[1,7.5,2011,1,2]] ) last = pd.DataFrame( columns=["code","grade","subject"], data=[[1,5.0,1],[1,7.5,2],[23,5.0,2]] )
需求一:统计满足特定筛选条件的行数
Pandas里统计符合条件的行数非常灵活,核心是用布尔索引筛选数据,再用shape[0]、len()或者count()获取行数。我给你举几个常见的例子:
例子1:统计general中code为1的学生所有记录行数
# 筛选code等于1的行,然后取行数 count_code_1 = general[general['code'] == 1].shape[0] print(count_code_1) # 输出:3
例子2:统计general中grade≥5且subject为2的记录行数
# 多条件筛选要用&连接,每个条件加括号 count_grade_subject = general[(general['grade'] >= 5) & (general['subject'] == 2)].shape[0] print(count_grade_subject) # 输出:2
例子3:统计last中grade等于5.0的行数
count_last_grade_5 = last[last['grade'] == 5.0].shape[0] print(count_last_grade_5) # 输出:2
你只需要根据自己的实际筛选条件调整布尔索引部分就行~
需求二:给last添加"attempts"列统计尝试次数
这里的逻辑是:对last里的每个学生(code)+科目(subject)组合,统计general中该组合出现的次数(也就是尝试次数)。咱们可以用groupby+merge来实现:
步骤1:先统计general中每个code+subject的尝试次数
# 按code和subject分组,统计每组的行数(即尝试次数) attempts_count = general.groupby(['code', 'subject']).size().reset_index(name='attempts')
这一步会生成一个新的DataFrame,每个行对应一个code+subject组合,以及对应的尝试次数。
步骤2:把统计结果合并到last中
# 按code和subject列合并,保留last的所有行 last = last.merge(attempts_count, on=['code', 'subject'], how='left')
最终结果
运行完上面的代码后,last会变成这样:
| code | grade | subject | attempts |
|---|---|---|---|
| 1 | 5.0 | 1 | 2 |
| 1 | 7.5 | 2 | 1 |
| 23 | 5.0 | 2 | 1 |
完美对应每个学生科目所需的尝试次数~
内容的提问来源于stack exchange,提问作者MTT
相关产品推荐
相关产品推荐

