我正在尝试编写一个简单的程序来跟踪本学期我的两门大学课程的出勤率。我必须至少有80%的出席率参加每个学科的每个班级。每个科目都有三个类别(T,TP和P)。
修补了一段时间后,我来找到groupby pandas函数:
import pandas as pd
import sys
df = pd.read_csv(sys.argv[1])
g = df.groupby(['Subject','Class']).count()
print(g)
每个类的源文件都有一行,当我进入时,我会在其中注明“ Presente”。当由于某种外部原因而没有上课时,我也会注意到“罪过”。这是源文件的前5行:
Date Day Subject Class Attendance Comments
0 6/8/2018 2 Medieval T Presente NaN
1 6/8/2018 2 Logica T Presente NaN
2 6/8/2018 2 Logica P NaN NaN
3 8/8/2018 4 Logica TP Sin clases Movilización IVE
4 8/8/2018 4 Logica P NaN Movilización IVE
这是当前输出。我无法确定的是如何执行某种操作并添加一列。例如,添加一列,仅对每个子组计数值为“ Presente”的行。我发现自己使事情变得过于复杂,我害怕丢失了一些东西。
z:\devs\py\asist>python asistb.py asist2q.csv
Date Day Attendance Comments
Subject Class
Logica P 32 32 3 4
T 16 16 4 3
TP 16 16 1 1
Medieval P 16 16 0 0
T 32 32 5 4
TP 16 16 1 1
非常感谢您提供有关如何解决该问题的技巧或提示。非常感谢!
答案 0 :(得分:2)
好像您需要unstack
+ stack
df.groupby(['Subject','Class']).count().unstack(fill_value=0).stack()
Out[296]:
Date Day Attendance Comments
Subject Class
Logica P 2 2 0 1
T 1 1 1 0
TP 1 1 1 1
Medieval P 0 0 0 0
T 1 1 1 0
TP 0 0 0 0
答案 1 :(得分:1)
给出示例df
,如下所示
Date Day Subject Class Attendance Comments
0 6/8/2018 2 Medieval T Presente NaN
1 6/8/2018 2 Logica T Presente NaN
2 6/8/2018 2 Logica P NaN NaN
3 8/8/2018 4 Logica TP Sinclases MovilizaciónIVE
4 8/8/2018 4 Logica P NaN MovilizaciónIVE
为了计算Presente
列中Attendance
的出现,您可以使用transform
方法和string search
和count
操作并添加结果在下面的新列中
df['counts'] = df.groupby(['Subject', 'Class'])['Attendance'].transform(
lambda x: x[x.str.contains('Presente', na=False)].count())
这将产生以下输出
Date Day Subject Class Attendance Comments counts
0 6/8/2018 2 Medieval T Presente NaN 1
1 6/8/2018 2 Logica T Presente NaN 1
2 6/8/2018 2 Logica P NaN NaN 0
3 8/8/2018 4 Logica TP Sinclases MovilizaciónIVE 0
4 8/8/2018 4 Logica P NaN MovilizaciónIVE 0
要计算每个主题的Presente总数,您可以再次使用groupby
并汇总计数列
df.groupby(['Subject'])['counts'].sum()
输出为
Subject
Logica 1
Medieval 1
Name: counts, dtype: int32