You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 15:38:18