对数据执行操作并将列添加到groupby结果中



我正试图写一个简单的程序来跟踪我这学期对两门大学课程的兴趣。我需要每门课至少有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 searchcount运算的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按列上出现的字符串计数分组

最新更新