'''
知识点:1. groupby的使用:a.根据大于一个的条件对df进行划分: df.groupby([df['date'],df['class']]) b.遍历groupby结果:for key, group in df_1c.对groupby结果进行聚类计算:sum = group['grade'].sum()2.loc的使用:a.根据大于一个的列值获取dataframe的子集,并获取/修改子集的某一列的值:获取:df.loc[(df['class'] == key[1]) & (df['date'] == key[0]),sum]修改:df.loc[(df['class'] == key[1]) & (df['date'] == key[0]), 'sum'] = sumb.获取dataframe某单元格的值——有待进一步研究mary_grade = list(group.loc[(group['name'] == 'mary'), 'grade'])[0]
'''import pandas as pd
df = pd.read_csv(r'C:\test\a.csv')
print('数据集:\n',df)print('\n================分别获取两天考试日的不同科目的每个人的分数=================')
df_1 = df.groupby([df['date'],df['class']]) # !! groupby的参数可以是一个series,或者是一个以series为元素的list
# print(df_1, type(df_1))
for key, group in df_1: print(key,'\n', group) # group是dataframe,是原df根据date和class两列值划分的子集print('\n================对每一天,每一门课程的考试,计算所有学生的总分.新增一列,加入到原有的df 中=================')
for key, group in df_1: # key 是一个元组,本例中是(date,class), 和groupby的条件是对应的
# print(key)
# print(group, type(group))sum = group['grade'].sum()print(f'grade sum of {key[1]} at {key[0]}: ', sum)df.loc[(df['class'] == key[1]) & (df['date'] == key[0]), 'sum'] = sum
print(df)
print('\n================对每一天,每一门课程的考试,计算mary获得分数在总分中的占比,加入原有df中=================')
for key, group in df_1: sum = group['grade'].sum()mary_grade = group.loc[(group['name'] == 'mary'), 'grade']print('mary grade is ', list(group.loc[(group['name'] == 'mary'), 'grade'])[0])avg = list(mary_grade / sum)[0] # mary_grade / sum 是series,我需要将计算好的avg取出来。应该有更合适的取出方式,有待研究。
# print(avg,type(avg))df.loc[(df['class'] == key[1]) & (df['date'] == key[0]), 'mary_avg'] = avg
print(df)
结果:
数据集:date name class grade
0 2020-07-01 mary math 70
1 2020-07-01 mary english 80
2 2020-07-01 tom math 80
3 2020-07-01 tom english 80
4 2020-07-02 mary math 60
5 2020-07-02 mary english 90
6 2020-07-02 tom math 40
7 2020-07-02 tom english 70================分别获取两天考试日的不同科目的每个人的分数=================
('2020-07-01', 'english') date name class grade
1 2020-07-01 mary english 80
3 2020-07-01 tom english 80
('2020-07-01', 'math') date name class grade
0 2020-07-01 mary math 70
2 2020-07-01 tom math 80
('2020-07-02', 'english') date name class grade
5 2020-07-02 mary english 90
7 2020-07-02 tom english 70
('2020-07-02', 'math') date name class grade
4 2020-07-02 mary math 60
6 2020-07-02 tom math 40================对每一天,每一门课程的考试,计算所有学生的总分.新增一列,加入到原有的df 中=================
grade sum of english at 2020-07-01: 160
grade sum of math at 2020-07-01: 150
grade sum of english at 2020-07-02: 160
grade sum of math at 2020-07-02: 100date name class grade sum
0 2020-07-01 mary math 70 150.0
1 2020-07-01 mary english 80 160.0
2 2020-07-01 tom math 80 150.0
3 2020-07-01 tom english 80 160.0
4 2020-07-02 mary math 60 100.0
5 2020-07-02 mary english 90 160.0
6 2020-07-02 tom math 40 100.0
7 2020-07-02 tom english 70 160.0================对每一天,每一门课程的考试,计算mary获得分数在总分中的占比,加入原有df中=================
mary grade is 80
mary grade is 70
mary grade is 90
mary grade is 60date name class grade sum mary_avg
0 2020-07-01 mary math 70 150.0 0.466667
1 2020-07-01 mary english 80 160.0 0.500000
2 2020-07-01 tom math 80 150.0 0.466667
3 2020-07-01 tom english 80 160.0 0.500000
4 2020-07-02 mary math 60 100.0 0.600000
5 2020-07-02 mary english 90 160.0 0.562500
6 2020-07-02 tom math 40 100.0 0.600000
7 2020-07-02 tom english 70 160.0 0.562500