Python 使用熊猫制作一份attendace学生报告
我有一些来自谷歌表单的csv表格用于考勤报告。数据如下所示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
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问题,并将该问题引用到此问题,我或其他人可以回答。