使用DataFrame将列数据显示为单个列



我有一个我的大数据集,我被弹出并清洁以最终看起来像图像中所示。干净的数据集在下面给出。

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')

这里更多示例。

您可能应该首先汇总每个学生参加的类数(实际上取决于您想要实现的确切措施 - 从您的问题和数据的屏幕截图中并不清楚(。

最新更新