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

2024-09-29 23:19:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大的数据集,我咀嚼和清理,最终看起来像在图像中显示。下面给出了干净的数据集。你知道吗

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

数据中提供了学生的信息,包括他们各自的注册号、姓名、上课日期和当天的上课人数。你知道吗

我想将“Date”列中的每个数据显示为一个单独的列。你知道吗

这样做的目的是显示每个学生在每个日期上的上课次数。学生通过他们唯一的注册号来识别。你知道吗

我想用如下标题查看我的数据帧:

RegistrationNo | StudentName | Date1 | Date2 | Date3. .......  | DateN  

然后是在上述各栏下提供的各自数据。你知道吗

例如: 样本输入:

16SCSE101002
12/3/2019

16SCSE101005
15/3/2019

样本输出:

16SCSE101002
2

16SCSE101005
0

用户输入注册号,他们应该能够看到该学生每天上课的出勤情况。你知道吗

我怎么能继续做这样的事呢?你知道吗


Tags: 数据图像信息datederek学生样本姓名
2条回答

我不清楚为什么要将数据帧转换为头中有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')

更多示例here。你知道吗

你可能应该先把每个学生的上课人数加起来(这取决于你想要达到的目标——从你的问题和数据截图上还不清楚)。你知道吗

相关问题 更多 >

    热门问题