现有3张表,表结构如下:
- 需将3张表采用外连接进行合并,将空值补充完整;
- 查找学生名字为李明,班级人数为50人的数据;
- 新增一列数据,学生成绩*0.8;
- 数据从小到大排序,并修改索引为学生名字;
import numpy as np
import pandas as pd
# 读取数据
map_class = pd.read_excel('./map_class.xlsx')
map_stu_num = pd.read_excel('./map_stu_num.xlsx')
class_grade = pd.read_csv('./class_grade.csv')
# 对数据进行合并
merge_1 = pd.merge(left=class_grade, right=map_class, how='outer', left_on=classid, right_on=class_id)
# 检查及清洗
set(class_grade['classid'].unique()) - set(map_class['classid'].unique()) #集合求差集,可以预判是否有空值
set(map_class['classid'].unique()) - set(class_grade['classid'].unique()) #集合求差集,可以预判是否有空值
merge_1.isnull().any(axis=0) #判断列方向是否有空值
merge_1.isnull().any(axis=1) #判断行方向是否有空值
merge_1.loc[merge_1.isnull().any(axis=1)]['classid'].unique() #查看为空值的班级id,然后线下查找为空的班级名字
merge_1.loc[merge_1['classid']=='id1002','class_name'] = '1002班级' #该方法仅适用于空值id较少情况下
merge_1 = merge_1.drop(labels = ['class_id'],axis = 1) #删除指定的列,classid与class_id重复
merge_11 = merge_1.drop(labels = merge_1.loc[merge_1['class_id']=='id1000'].index, axis=0).copy() #删除“id1000”的行,一般删除数据会复制一份
merge_11.dropna(inplace = True) #删除空值的行,不用赋值,采用inplace可直接修改内存结构
merge_11.fillna(value=0) #填充空值
#再次进行合并
merge_2 = pd.merge(left=merge_11, right=map_stu_num, how='outer')
#查找学生名字为李明,班级人数为50人的数据
data1 = merge_2.query('class_name=="李明" & num==50 ')
merge_2.loc('class_name=="李明" & num==50 ')
#新增一列数据,学生成绩*0.8
merge_2['80per_grade'] = merge_2['stu_grade']*0.8
#数据从小到大排序,并修改索引为学生名字
data2 = merge_2.sort_values(by = ['stu_grade'],ascending=True)#先按sc,再按ma排序,降序
data3 = data2.set_index(keys=[stu_name']) #指定某一列作为行索引



