【问题标题】:Performing operations on data and adding column to groupby results对数据执行操作并将列添加到 groupby 结果
【发布时间】:2018-08-08 04:47:32
【问题描述】:

我正在尝试编写一个简单的程序来跟踪我本学期两门大学课程的出勤情况。我需要每个科目的每个班级至少有 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”。当由于某些外部原因没有上课时,我也会注意“Sin Clases”。这是源文件前 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

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

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      举个例子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 的出现次数,您可以使用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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-16
        • 1970-01-01
        • 2015-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-12
        相关资源
        最近更新 更多