1.数据分析常用开源库
Pandas
基于Numpy,特点高效的科学计算库,核心的数据对象是ndarray(n维数组)
Series 一列数据
DataFrame 二维表
绘图的库最基础的 Matplotlib
Pandas 有绘图的API,基于Matplotlib
Seaborn 基于Matplotlib
注释:
简单起见,下文中"df"均写为"表名","函数"均写为"HS","属性"均写为"SX","范围"均写为"FW"
2.Pandas 数据结构
Series的创建
pd.Series()
S大写
传入一个、两个参数
第一个参数就是数据, 也可以通过index = 指定行索引
如果不指定行索引, 会默认添加从0开始的索引
传入的数据可以是以下类型
numpy的ndarray
python 列表,元组,字典
传入的如果是字典,字典的key作为索引,Value就是数据
一列Series数据类型必须一致的
如果既有字符串,又有数字,会默认是字符串类型 Object
Series属性
s.shape # 形状 描述Series有几行 返回一个元组 s.values # Series的值 默认ndarray类型 s.index # Series的索引, 如果手动指定, 就是一个ndarray类型, 如果是自动生成 rangeIndex()
3.DataFrame创建
# 定义一个字典 dict_data ={ 'id':[1,2,3], 'name':['张三','李四','王五'], 'age':[18,20,22] } # 储存在df中 df = pd.DataFrame(dict_data) df
4.文件加载
# 不创建也可以加载文件 df = pd.read_csv('D:/Yuanman/day01/02_代码/data/scientists.csv') df = pd.read_csv('D:/Yuanman/day01/02_代码/data/scientists.csv',encoding='gbk') df
5.HS与SX
# 红色m:HS,用() # 紫色p:SX,乄||[]
6.HS-初始化表格
加载数据之后,做具体的业务处理之前,一般固定的套路
head() info() describe()
从脑袋上取前5条,也可指定条数
表名.head()
从尾巴上取后5条,也可指定条数
表名.tail()
字段有哪些,有没有空值
表名.info()
看数据的分布情况
表名.describe()
查看所有数据分布情况
表名.describe(include='all')
查看有几个唯一值
表名.unique()
7.HS-获取最值索引
# 返回最大值的下标 表名['列名'].argmax() # 返回最小值的下标 表名['列名'].argmin() # 返回最大值的索引值 表名['列名'].idxmax() # 返回最小值的索引值 表名['列名'].idxmin()
8.SX-显示行列
# 显示几行几列 表名.shape # 仅显示行 表名.shape[0] # 仅显示列 表名.shape[1] # 显示所有值 表名.values
9.HS/SX-索引
# 行索引FW及步长 表名.index # 显示列索引及类型 表名.columns # 把某一列数据作为索引,加inplace=True替换原索引 表名.set_index('列名',inplace=True) # 重置所有为从0开始的整数 表名.reset_index() # 将其行索引修改为对应的列值 表名.index = df2['列名'] # 将其列索引(字段)修改为对应值 表名.columns =['列1','列2'] # 单独修改某行某列的索引,注意rename和replace类似,如果旧值没有找到,不会报错 表名.rename(index={0:'行索引名'},columns={'旧列名':'新列名'})
10.HS-计数
# 计算所有列的数据数,也可以单独计算某列 表名.count() # 分组计数,查看每个分组的数量并降序,也可以单独计算某列 # 详细分组算法见第十七章第6题 表名.value_counts(ascending=False)
11.HS-最值中位数平均值标准差求和
# 计算所有列的最大值,也可以单独计算某列 表名.max() # 计算所有列的最小值,也可以单独计算某列 表名.min() # 计算所有列的平均值,也可以单独计算某列 表名.mean() # 计算所有列的中位数,也可以单独计算某列 表名.median() # 标准差(方差开根号,反映了数据的离散程度,也可以单独计算某列) s1.std() # 对文件某一列或某多列进行求和,0是对列求和,默认是0 表名['字段'].sum() # 1是对行求和,此时列字段至少两个 表名[['字段1','字段2']].sum()
12.HS-排序
# 按照某列排序,True升/False降,不指定显示列则为全部 表名['显示列名'].sort_values(by='筛选字段名',ascending=False) # 根据某字段排序后显示其他字段 名称 = 表名[['字段1','字段2']].sort_values(by='字段2',ascending=False)
13.HS-去重
# 去重,假删 表名.drop_duplicates() # 去重,真删(False假True真) 表名.drop_duplicates(inplace=True)
subset 传入列名的列表,用来做重复判断的条件
keep = 默认是first 满足重复条件的数据,保留第一次出现的,还可以选last 保留最后一次出现的
ignore_index = 默认是False 去重后会保留原来的索引,改成True之后,会重新给从0开始的索引
inplace 替换
表名.drop_duplicates(subset=['字段1','字段2']) 表名.drop_duplicates(subset=['字段1','字段2'],keep='last',inplace=True) 表名.drop_duplicates(subset=['字段1','字段2'],keep='last',ignore_index=True)
14.应用
# select * 表名[直接就条件] # 加条件select* 新表 = 原表[原表['销售渠道']=='线下'] 新表 # 获取数据的一列或多列 表名['列名'] 表名[['列1,列2']]# 通过下标切片方式获取部分行,[初始索引:终止索引:步长],不包括终止索引(左闭右开) 表名[a:b:c]# 相当于sql中的where筛选,多个条件需要用()括起来,位运算连接(and:&,or:|) 表名['显示列'][表名['列名']=='数值']# 根据条件增新列 表名['新列名']=表名['数据列1']-表名['数据列2']# 拿出行数据,用列展示,[]内是行列名,不是编号 表名.loc[0] # 所有行加一列 表名.loc[:,'列名'] # 0到3(左闭右闭) 表名.loc[:3] # 列名也可以加:指定列FW 表名.loc[:3,:'列名'] 表名.loc[:3,['列1','列2']] # 逗号前也可以作条件筛选 表名.loc[df['区域']=='望京租房',:'价格']# 输出指定索引值的数据,[]内是编号,不是行列名,其他同上 新表名 = 带索引的表.iloc[0]['输出列名']
15.数据的保存和读取
# 创建数据文件 import pandas as pd data =[ [1,'张三','1999-3-10',18], [2,'李四','2002-3-10',15], [3,'王五','1990-3-10',33], [4,'隔璇老王','1983-3-10',40] ] df = pd.DataFrame(data,columns=['id','name','birthday','age']) # 将数据存储为表格文件 df.to_excel('test2.xlsx',sheet_name='student',index=False) # 读取该文件 pd.read_excel('test2.xlsx',sheet_name='student') # 将数据存储为csv文件 df.to_csv('test2.csv',index=False) # 指定分隔符 df.to_csv('test3.csv',index=False,sep='\t') # 读取该文件 pd.read_csv('test2.csv')
16.HS-query查询
# 引号外单内双 表名.query('区域=="望京租房"').head() 表名.query('区域 in ["望京租房","回龙观租房"]')['单独取该列'] # 层层递进 新表名 = 表名.query('区域 in ["望京租房","回龙观租房"]') 新新表名 = 新表名.query('朝向 in [“东”,"南”]')['单独取该列'] # 层层递进合成(类似于子查询) 表名.query('区域 in ["望京租房","回龙观租房"]').query('朝向 in ["东","南"]')['单独取该列'] # 上式也能这么写 表名.query('区域 in ["望京租房","回龙观租房"] and 朝向 in ["东","南"]')['单独取该列']
17.HS-isin
# 筛选是否为指定数据,输出True和False 表名['区域'].isin(['望京租房','回尨观租房']) # 再传给df,输出所有字段 表名[表名['区域'].isin(['望京租房','回尨观租房'])] # 多条件筛选(&或|) 表名[(表名['区域'].isin(['望京租房','回尨观租房'])) & (表名['朝向'].isin(['西南 东北','南 北']))]