繁体   English   中英

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

[英]Performing operations on data and adding column to groupby results

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

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

似乎您需要unstack stack + 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次数,您可以将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计算字符串在列上的出现

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM