我有一个我的大数据集,我被弹出并清洁以最终看起来像图像中所示。干净的数据集在下面给出。
RegistrationNo StudentName Date ClassAttend
16SCSE101002 Eric Brown 12-03-2019 1
16SCSE101002 Eric Brown 08-03-2019 1
16SCSE101002 Eric Brown 12-03-2019 1
16SCSE101002 Eric Brown 15-03-2019 1
16SCSE101002 Eric Brown 08-03-2019 1
16SCSE101002 Eric Brown 22-03-2019 0
16SCSE101002 Eric Brown 22-03-2019 0
16SCSE101002 Eric Brown 26-03-2019 1
16SCSE101005 Derek Oldman 15-02-2019 1
16SCSE101005 Derek Oldman 12-02-2019 0
16SCSE101005 Derek Oldman 15-02-2019 1
16SCSE101005 Derek Oldman 29-03-2019 1
16SCSE101005 Derek Oldman 12-02-2019 0
16SCSE101005 Derek Oldman 29-03-2019 1
16SCSE101005 Derek Oldman 02-04-2019 1
16SCSE101005 Derek Oldman 02-04-2019 1
16SCSE101005 Derek Oldman 12-03-2019 1
在数据中,提供了有关学生各自的注册号,姓名,班级日期和当天上课数量的信息。
我想将每个数据显示为单个列中的"日期"。
这个想法是显示每个学生在每个日期都参加的课程数。学生通过其独特的注册号来确定。
我想使用以下标题查看我的数据框:
RegistrationNo | StudentName | Date1 | Date2 | Date3. ....... | DateN
随后是上述每一列下提供的单独数据。
例如:样本输入:
16SCSE101002
12/3/2019
16SCSE101005
15/3/2019
样本输出:
16SCSE101002
2
16SCSE101005
0
用户进入注册号,他们应该能够在上课的每一天看到该学生的出勤率。
我该如何继续这样做?
我不清楚为什么要将dataframe转换为标题中的date1,date2等。如果目的只是让注册的学生在给定的一天出席,我建议其他两个选择(可能有数百种方法(。
from datetime import datetime
import pandas as pd
# Small subset of your data
df = pd.DataFrame({'RegistrationNo': ['16SCSE101002']*7,
'StudentName': ['DEREK TIMBER'] * 7,
'Date': ['12/03/2019', '08/03/2019', '12/03/2019', '15/03/2019',
'08/03/2019','22/03/2019', '22/03/2019'],
'ClassAttend': [1,1,1,1,1,0,0]})
# Convert the 'string-dates' to pandas.datetime
df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)
选项1,要在给定日期获得给定注册号的类数,请使用简单的过滤器和sum
-函数
reg_no = '16SCSE101002'
reg_date = datetime(2019, 3, 12)
# This gives you what you want
df[(df['RegistrationNo'] == reg_no) & (df['Date']==reg_date)]['ClassAttend'].sum()
或者如果您想要每天的所有总和进行整个列表,请执行groupby
-sum
df_summed = df.groupby(['RegistrationNo', 'StudentName', 'Date'])['ClassAttend'].sum().reset_index()
RegistrationNo StudentName Date ClassAttend
0 16SCSE101002 DEREK TIMBER 2019-03-08 2
1 16SCSE101002 DEREK TIMBER 2019-03-12 2
2 16SCSE101002 DEREK TIMBER 2019-03-15 1
3 16SCSE101002 DEREK TIMBER 2019-03-22 0
,然后您可以不用总和就可以使用前所述的过滤器。
如果您按照建议的方式有非常有力的理由,请告诉我(所以我至少可以删除此答案:)(。
您可以使用pivot
函数在一点播放。
例如,您可以尝试:
df.pivot(index='RegistrationNo', columns='Date', values='ClassAttend')
这里更多示例。
您可能应该首先汇总每个学生参加的类数(实际上取决于您想要实现的确切措施 - 从您的问题和数据的屏幕截图中并不清楚(。