我正试图写一个简单的程序来跟踪我这学期对两门大学课程的兴趣。我需要每门课至少有80%的出勤率。每个科目有三个班(T、TP和P(。
经过一段时间的修补,我发现了熊猫分组功能:
import pandas as pd
import sys
df = pd.read_csv(sys.argv[1])
g = df.groupby(['Subject','Class']).count()
print(g)
源文件中每个类都有一行,当我转到该行时,我会注意到"Present"。当由于一些外部原因没有课的时候,我也会注意到"罪恶冲突"。这就是源文件的前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
这是电流输出。我不知道如何执行某种操作并添加一列。例如,为每个子组添加一列,只计算值为"Present"的行。我发现自己把事情弄得太复杂了,我担心我错过了什么。
z:devspyasist>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
关于如何处理这个问题的提示或提示将不胜感激。非常感谢!
似乎需要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
给定示例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
为了计算Attendance
列中Presente
的出现次数,您使用带有string search
和count
运算的transform
方法,并将结果添加到新列中,如下所示
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
要计算每个主题的演示者总数,您可以再次使用groupby
并将计数列相加
df.groupby(['Subject'])['counts'].sum()
输出为
Subject
Logica 1
Medieval 1
Name: counts, dtype: int32
来源:pandas按列上出现的字符串计数分组