R语言:为DataFrame新增列统计每行'A'(缺勤)的出现次数
统计DataFrame每行中'A'的出现次数
问题背景
现有如下包含学生出勤记录的DataFrame,其中P代表出勤,A代表缺勤,L代表请假:
student_id day_1 day_2 day_3 day_4 day_5 day_6 day_7 day_8 A_0001 P P P A P L P P B_0001 A P P P P P L P C_0001 P P P P P P A P A_0002 P P P P P P P L A_0003 P P L P P P P P A_0005 P P P P P A P P B_0002 P P P P L L P P B_0004 P P P P L A P P B_0005 P P P P P P L P
需要新增一列,统计每个学生对应行中A的出现次数,此前尝试用for循环实现报错,现寻求正确方案。
解决方案
推荐:使用Pandas内置方法(高效无循环)
Pandas提供批量处理的内置方法,比手动循环效率高得多,代码如下:
import pandas as pd # 构造示例DataFrame(已有DataFrame可跳过此步) data = { 'student_id': ['A_0001', 'B_0001', 'C_0001', 'A_0002', 'A_0003', 'A_0005', 'B_0002', 'B_0004', 'B_0005'], 'day_1': ['P', 'A', 'P', 'P', 'P', 'P', 'P', 'P', 'P'], 'day_2': ['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'], 'day_3': ['P', 'P', 'P', 'P', 'L', 'P', 'P', 'P', 'P'], 'day_4': ['A', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'], 'day_5': ['P', 'P', 'P', 'P', 'P', 'P', 'L', 'L', 'P'], 'day_6': ['L', 'P', 'P', 'P', 'P', 'A', 'L', 'A', 'P'], 'day_7': ['P', 'L', 'A', 'P', 'P', 'P', 'P', 'P', 'L'], 'day_8': ['P', 'P', 'P', 'L', 'P', 'P', 'P', 'P', 'P'] } df = pd.DataFrame(data) # 新增缺勤统计列 df['absent_count'] = df.filter(like='day_').eq('A').sum(axis=1) # 查看核心结果 print(df[['student_id', 'absent_count']])
代码说明:
df.filter(like='day_'):筛选所有以day_开头的列,排除student_id.eq('A'):将每个单元格转换为布尔值,等于A则为True,否则为False.sum(axis=1):按行对布尔值求和(True记为1,False记为0),得到每行A的数量
备选:正确的for循环写法(仅作参考,不推荐)
如果必须使用循环,需避免链式赋值等常见错误,正确写法如下:
# 初始化新列 df['absent_count_loop'] = 0 # 遍历每行索引 for idx in df.index: # 获取当前行的所有day列数据 day_cols = df.columns[df.columns.str.startswith('day_')] row_data = df.loc[idx, day_cols] # 统计'A'的数量 count = (row_data == 'A').sum() # 赋值给对应行的新列 df.loc[idx, 'absent_count_loop'] = count # 查看核心结果 print(df[['student_id', 'absent_count_loop']])
注意事项:
- 使用
df.loc[idx, col]赋值,避免df['col'][idx]链式写法引发的SettingWithCopyWarning - 先筛选day列再统计,避免误包含
student_id列导致错误
内容的提问来源于stack exchange,提问作者Amitav Roy
相关产品推荐
相关产品推荐

