Python 使用熊猫制作一份attendace学生报告

Python 使用熊猫制作一份attendace学生报告,python,pandas,dataframe,Python,Pandas,Dataframe,我有一些来自谷歌表单的csv表格用于考勤报告。数据如下所示 df1= pd.read_csv("12-9-2020.csv") df1 Name StudentID Robert C 102 Jessica Myla 103 Nana D 105 df2= pd.read_csv("12-10-2020.csv") df2 Name StudentID J Myla

我有一些来自谷歌表单的csv表格用于考勤报告。数据如下所示

df1= pd.read_csv("12-9-2020.csv")
df1

Name            StudentID
Robert C        102
Jessica Myla    103
Nana D          105

df2= pd.read_csv("12-10-2020.csv")
df2

Name            StudentID
J Myla          103
Harris Kurt     104
Nana Duncan     105
我有很多表格,我想做一份出勤报告。基本的考勤报告如下所示:

df_Basic
Name             StudentID  12/9/2020   12/10/2020
Robert Case      102        0           0
Jessica Myla     103        0           0
Harris Kurt      104        0           0
Nana Duncan      105        0           0
df_Result
Name          StudentID 12/9/2020   12/10/2020
Robert Case   102       1           0
Jessica Myla  103       1           1
Harris Kurt   104       0           1
Nana Duncan   105       1           1
我想将数据表df1、df2输入到编制考勤报告中。如果学生上课,则必须为1,学生姓名的拼写将与出勤报告格式相匹配

预期结果如下所示:

df_Basic
Name             StudentID  12/9/2020   12/10/2020
Robert Case      102        0           0
Jessica Myla     103        0           0
Harris Kurt      104        0           0
Nana Duncan      105        0           0
df_Result
Name          StudentID 12/9/2020   12/10/2020
Robert Case   102       1           0
Jessica Myla  103       1           1
Harris Kurt   104       0           1
Nana Duncan   105       1           1

谢谢你帮我

也许你可以用

df1=pd.read_csv12-9-2020.csv df1 学生姓名 罗伯特C 102 杰西卡·迈拉103 娜娜D 105 df2=pd.read_csv12-10-2020.csv 从第二个表中获取ID 当前实体的ID=df2['StudentID'].values.tolist 在第一个数据框中创建一个日期列 当前日期='12/9/2020' df1[当前日期]=0 df1[df1['StudentID'].isinids_of_presentes][current_date]=1表示唯一在场学生的出席情况。
没有数据帧。希望它是好的

你可以用

df1=pd.read_csv12-9-2020.csv df1 学生姓名 罗伯特C 102 杰西卡·迈拉103 娜娜D 105 df2=pd.read_csv12-10-2020.csv 从第二个表中获取ID 当前实体的ID=df2['StudentID'].values.tolist 在第一个数据框中创建一个日期列 当前日期='12/9/2020' df1[当前日期]=0 df1[df1['StudentID'].isinids_of_presentes][current_date]=1表示唯一在场学生的出席情况。
没有数据帧。希望不错

以下是两个数据帧的解决方案:

df1.set_index('StudentID', inplace=True)
df1.loc[:, '12-9-2020.csv'] = 1

df2.set_index('StudentID', inplace=True)
df2.loc[:, '12-10-2020.csv'] = 1
df1 = df1.join(df2, how='outer', rsuffix='_')
df1['Name'] = df1['Name'].combine_first(df1['Name_'])
df1.drop('Name_', axis=1, inplace=True)

df1.fillna(0).reset_index()

对于更多数据帧,根据需要重复第3-7行。

以下是两个数据帧的解决方案:

df1.set_index('StudentID', inplace=True)
df1.loc[:, '12-9-2020.csv'] = 1

df2.set_index('StudentID', inplace=True)
df2.loc[:, '12-10-2020.csv'] = 1
df1 = df1.join(df2, how='outer', rsuffix='_')
df1['Name'] = df1['Name'].combine_first(df1['Name_'])
df1.drop('Name_', axis=1, inplace=True)

df1.fillna(0).reset_index()

对于更多数据帧,根据需要重复第3-7行。

以下是完整的解决方案:

df-从桌面上的特定文件夹将所有文件动态读入到一个数据框中,并使用文件名中的assign和derive Date创建日期列。必须在files变量中指定此选项 df_Attention-with.groupby,按StudentID返回1或0,并在列中输入日期 df_names-通过选择每个ID的最长名称作为名称来规范名称数据 df_Attention-加入两个数据框df_Attention和df_名称 如果要更改“日期”列中日期的格式,则可以运行以下非常类似的代码:

files = glob.glob(r'Desktop\Students\*.csv')
df = pd.concat([pd.read_csv(f).assign(Date=pd.to_datetime(os.path.basename(f)[:-4]))
                for f in files]).sort_values(['StudentID', 'Date'])
df_attendance = (df.groupby(['StudentID', df['Date'].dt.strftime('%m/%d/%y')], sort=False).size()
                   .unstack(1).fillna(0).astype(int))
df_names = (df.groupby(['StudentID'])['Name'].apply(list)
              .apply(lambda x: [y for y in x if len(y) == 
                                max([len(z) for z in x])][0])).to_frame()
df_Result = df_names.join(df_attendance).reset_index()
df_Result

Out[2]: 
   StudentID          Name  12/09/20  12/10/20
0        102      Robert C         1         0
1        103  Jessica Myla         1         1
2        104   Harris Kurt         0         1
3        105   Nana Duncan         1         1
根据你的评论,你可以这样做。请注意,对于直接匹配,最好使用StudentID而不是Name,因此,如果使用以下选项,只需将StudentID替换为Name即可:


以下是完整的解决方案:

df-从桌面上的特定文件夹将所有文件动态读入到一个数据框中,并使用文件名中的assign和derive Date创建日期列。必须在files变量中指定此选项 df_Attention-with.groupby,按StudentID返回1或0,并在列中输入日期 df_names-通过选择每个ID的最长名称作为名称来规范名称数据 df_Attention-加入两个数据框df_Attention和df_名称 如果要更改“日期”列中日期的格式,则可以运行以下非常类似的代码:

files = glob.glob(r'Desktop\Students\*.csv')
df = pd.concat([pd.read_csv(f).assign(Date=pd.to_datetime(os.path.basename(f)[:-4]))
                for f in files]).sort_values(['StudentID', 'Date'])
df_attendance = (df.groupby(['StudentID', df['Date'].dt.strftime('%m/%d/%y')], sort=False).size()
                   .unstack(1).fillna(0).astype(int))
df_names = (df.groupby(['StudentID'])['Name'].apply(list)
              .apply(lambda x: [y for y in x if len(y) == 
                                max([len(z) for z in x])][0])).to_frame()
df_Result = df_names.join(df_attendance).reset_index()
df_Result

Out[2]: 
   StudentID          Name  12/09/20  12/10/20
0        102      Robert C         1         0
1        103  Jessica Myla         1         1
2        104   Harris Kurt         0         1
3        105   Nana Duncan         1         1
根据你的评论,你可以这样做。请注意,对于直接匹配,最好使用StudentID而不是Name,因此,如果使用以下选项,只需将StudentID替换为Name即可:


谢谢,我有一个错误-名称“joint”没有定义-输入错误。它应该是df1。谢谢,我收到一个错误-名称“joint”没有定义-输入错误。应该是df1,谢谢你的回复@david如果有一个学生从未填写过google表单,那么他或她的名字会出现在基本的出勤报告中。他或她的名字不会出现在出勤报告的最后。嗨@Arief这是一个额外的问题,但请看我答案的底部。如果您需要更多详细信息,请创建一个新的stackoverflow问题,并将该问题引用到此问题,我或其他人可以回答。谢谢您的回复@david如果有一个学生从未填写过google表单,那么他或她的名字会出现在基本的出勤报告中。他或她的名字不会出现在出勤报告的最后。嗨@Arief这是一个额外的问题,但请看我答案的底部。如果您需要更多详细信息,请创建一个新的stackoverflow问题,并将该问题引用到此问题,我或其他人可以回答。