对数据执行操作并将列添加到分组依据结果

时间:2018-08-07 19:55:13

标签: python pandas pandas-groupby

我正在尝试编写一个简单的程序来跟踪本学期我的两门大学课程的出勤率。我必须至少有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

非常感谢您提供有关如何解决该问题的技巧或提示。非常感谢!

2 个答案:

答案 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 searchcount操作并添加结果在下面的新列中

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

来源:pandas groupby count string occurrence over column