1 表格数据的行列操作
2 查询指定的数据内容
3 数据类型处理
4 缺失值处理
5 透视表
6 分组与聚合
7 统计NBA夺冠次数
8 数据的纵向合并(扩展数据)
9 数据的横向合并(连接表)
1 表格数据的行列操作
# 增
df['info'] = '这些车都很好'
df['desc'] = df['Sec_price'] * df['Km(W)']
df.insert(1,'haha','你好')
# 改
df.rename(columns={'Brand':'品牌'})
# 查
df['Name']
# 删
df.drop(columns='haha',axis=1)
axis=1表示列字段
axis=0表示行索引
2 查询指定的数据内容
# 获取单列数据
df['Name']
# 获取多列数据
df[['Name','New_price','Sec_price']]
# 获取Discharge是国4的所有数据项
# df['Discharge'] == '国4' # 布尔值
df[df['Discharge'] == '国4'] # 布尔选择器
# 获取品牌是众泰并且Discharge是国4的所有数据项
# (df['Discharge'] == '国4') & (df['品牌'] == '众泰') # 布尔值
df[(df['Discharge'] == '国4') & (df['品牌'] == '众泰')] # 布尔选择器
# 获取品牌是众泰并且Discharge是国4的数据的品牌、Name、New_price
df.loc[(df['Discharge'] == '国4') & (df['品牌'] == '众泰'),['品牌','Name','New_price']]
# 如果针对筛选出来的数据还需要做字段的筛选处理 那么需要使用loc方法
"""
逻辑运算符连接的条件都必须使用括号括起来
"""
3 数据类型处理
# 如何查看字段的数据类型
df.dtypes
# 通过dtypes查看字段的数据类型 将不符合条件的类型进行人为的修改操作
# df['Boarding_time']
# 当字段名存在的时候 不加赋值符号表示获取数据 加了赋值符号表示修改数据
df['Boarding_time'] = pd.to_datetime(df['Boarding_time'],format='%Y年%m月') # %Y %m %d %H %M %S %X
# 将New_price字符串类型数据转换成数字类型的数据
# 第一步要想办法将字符串万剔除
##################################
# df['New_price'][:-1]
# df['New_price'].replace('万','')
# 上述两种方法都不能直接处理,如果需要处理需要先加一个内置方法str(固定用法)
# df['New_price'].str[:-1]
# df['New_price'].str.replace('万','')
##################################
# 第二步将剩余的部分转换成数字
df['New_price'] = df['New_price'].str[:-1].astype('float')
4 缺失值处理
isnull
notnull
fillna
dropna
# 判断数据是否有缺失
# data05.isnull() # 当数据量特别大的时候还是不容易查看
data05.isnull().sum() # 通过sum求和 统计每个字段下缺失数据的个数
# 计算缺失数据占比(绝对是否删除还是填充)
data05.isnull().sum() / data05.shape[0]
"""notnull与isnull刚好相反 这里不做过多的介绍"""
# 删除缺失数据
data05.shape
data05.dropna().shape
"""
针对缺失数据
我们不能一味的删除,尤其是数据量本来就少的情况下,再删除数据会导致资源的浪费
所以有时候针对缺失数据我们会采取填充的策略,将缺失数据补全
"""
data05.fillna(value=666) # 虽然fillna可以填充数据 但是我们在填充数据的时候不能鲁莽的填充相同的值
######################################################
# 应该遵循不同类别的缺失采取不同的填充策略
data05.fillna(value = {
'gender':data05.gender.mode()[0], # 众数:可以有一个也可能是多个
'age':data05.age.mean(), # 平均值
'income':data05.income.median() # 中位数
})
######################################################
5 透视表
我们在学习excel操作的时候都接触过透视表
本质其实就将一张表按照一定的条件和需求做成另外一张表
data06 = pd.read_csv(r'diamonds.csv')
data06.head()
# 按照颜色分类 之后求解每一个分类下价格的平均值
# pd.pivot_table(data06, index = 'color', values='price', aggfunc='mean')
# 先按照颜色分类 之后再每个颜色分类下 再按照clarity分组 之后求解价格的个数(商品个数)
pd.pivot_table(data06, index = 'color', columns='clarity', values='price', aggfunc='size')
6 分组与聚合
分组
按照给定的条件将单个单个的数据组织到一起形成一个一个的整体
聚合
针对分组之后的整体进行数学统计计算
# MySQL好好复习
# 按照颜色分组
# data06.groupby(['color']).groups
# 按照颜色分组 并统计每个颜色下的商品数量 和 平均价格
data06.groupby(['color']).aggregate({
'color':'size',
'price':'mean'
})
# 分组的依据可以有多个
grouped = data06.groupby(by = ['color','cut']) # 先按照颜色分组 再按照cut分组
# 对分组变量进行统计汇总
result = grouped.aggregate({'color':np.size, 'carat':np.min,
'price':np.mean, 'table':np.max})
result
# 针对分组之后的字段展示 我们可以自定义顺序 也可以在计算的时候就安排好顺序
# 调整变量名的顺序
result = pd.DataFrame(result, columns=['price','color','carat','table'])
result
# 数据集重命名
result.rename(columns={'color':'个数',
'carat':'最小重量',
'price':'平均价格',
'table':'最大面积'})
7 统计NBA夺冠次数
# 如何获取网页球队数据
"""
pd.read_html()
类似于爬虫,能够爬取页面数据,并且将页面上的table标签里面的数据全部提取出来
"""
如果你的机器执行上述代码报错不要慌张,冷静下来分析,或者直接百度搜索,锻炼自我解决问题的能力,不要遇到问题对他人产生依赖
8 数据的纵向合并(扩展数据)
# 注意:纵向合并表数据需要确保字段名一致
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None)
objs:指定需要合并的对象,可以是序列、数据框或面板数据构成的列表
axis:指定数据合并的轴,默认为0,表示合并多个数据的行,如果为1,就表示合并多个数据的列
join:指定合并的方式,默认为outer,表示合并所有数据,如果改为inner,表示合并公共部分的数据
join_axes:合并数据后,指定保留的数据轴
ignore_index:bool类型的参数,表示是否忽略原数据集的索引,默认为False,如果设为True,就表示忽略原索引并生成新索引
keys:为合并后的数据添加新索引,用于区分各个数据部分
# 构造数据集df1和df2
df1 = pd.DataFrame({
'name':['张三','李四','王二'],
'age':[21,25,22],
'gender':['男','女','男']}
)
df2 = pd.DataFrame({
'name':['丁一','赵五'],
'age':[23,22],
'gender':['女','女']}
)
# 数据集的纵向合并
pd.concat([df1,df2] , keys = ['df1','df2']) # 加keys参数可以在合并之后看到数据来源
pd.concat([df1,df2] , keys = ['df1','df2']).reset_index()
pd.concat([df1,df2] , keys = ['df1','df2']).reset_index().drop(labels ='level_1', axis = 1).rename(columns = {'level_0':'Class'})
# 如果df2数据集中的“姓名变量为Name”
df2 = pd.DataFrame({
'Name':['丁一','赵五'],
'age':[23,22],
'gender':['女','女']}
)
# 数据集的纵向合并
pd.concat([df1,df2])
# concat行合并,数据源的变量名称完全相同(变量名顺序没有要求)
9 数据的横向合并(连接表)
# 与我们在MySQL阶段学习的连接表一模一样
"""
inner join
left join
right join
"""
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'))
left:指定需要连接的主 right:指定需要连接的辅表
how:指定连接方式,默认为inner内连,还有其他选项,如左连left、右连right和外连outer on:指定连接两张表的共同字段
left_on:指定主表中需要连接的共同字段
right_on:指定辅表中需要连接的共同字段
left_index:bool类型参数,是否将主表中的行索引用作表连接的共同字段,默认为False right_index:bool类型参数,是否将辅表中的行索引用作表连接的共同字段,默认为False sort:bool类型参数,是否对连接后的数据按照共同字段排序,默认为False
suffixes:如果数据连接的结果中存在重叠的变量名,则使用各自的前缀进行区分
# 构造数据集
df3 = pd.DataFrame({
'id':[1,2,3,4,5],
'name':['张三','李四','王二','丁一','赵五'],
'age':[27,24,25,23,25],
'gender':['男','男','男','女','女']})
df4 = pd.DataFrame({
'Id':[1,2,2,4,4,4,5],
'score':[83,81,87,75,86,74,88],
'kemu':['科目1','科目1','科目2','科目1','科目2','科目3','科目1']})
df5 = pd.DataFrame({
'id':[1,3,5],
'name':['张三','王二','赵五'],
'income':[13500,18000,15000]})
# 首先df3和df4连接
merge1 = pd.merge(left = df3,
right = df4,
how = 'left',
left_on='id',
right_on='Id')
# 再将连接结果与df5连接
merge2 = pd.merge(left = merge1,
right = df5,
how = 'left')