当前位置: 代码迷 >> 综合 >> 【pandas】根据多个列对dataframe进行划分,在划分结果上进行计算;使用loc,根据多个列的值获取datafarme子集和某单元格的值
  详细解决方案

【pandas】根据多个列对dataframe进行划分,在划分结果上进行计算;使用loc,根据多个列的值获取datafarme子集和某单元格的值

热度:34   发布时间:2024-02-07 21:50:31.0

 

'''
知识点: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

 

 

  相关解决方案