数据预处理03

DateFrame

DataFrame是一个可以包含不同数据类型列的二维数据结构,类似于电子表格或SQL表,或Series对象的字典集合,是最常用的pandas对象。

创建DateFrame

数组创建dataframe

pd.DataFrame(arr2,index=["a","b","c"],columns=["A","B","C","D","E","F","G"])

数据预处理03

通过字典创建dataframe 默认键为纵向索引

dict1={'姓名':["小李","小张","小刘","小马"],
       '成绩':[95,96,94,97],
       '加权':[87.5,88.1,89.6,90.1]}
df2=pd.DataFrame(dict1)

数据预处理03

增添横向索引用index

dict2={'姓名':pd.Series(["小李","小张","小刘","小马"],index=["001","002","003","004"]),
       '成绩':pd.Series([95,96,94],index=["001","002","003"]),
       '加权':pd.Series([87.5,88.1,89.6,90.1],index=["001","002","003","004"]),}
df3=pd.DataFrame(dict2)
df3.index   #Index(['001', '002', '003', '004'], dtype='object')
df3.columns   #Index(['姓名', '成绩', '加权'], dtype='object')

数据预处理03
Dataframe的列操作

dict3={'员工姓名':pd.Series(["赵一","钱明","周元"],index=["001","002","003"]),
       '销售业绩':pd.Series([30000.0,20000.0],index=["001","002"]),
       '提成收入':pd.Series([6000,4000,10000],index=["001","002","003"])
       }
df4=pd.DataFrame(dict3)

数据预处理03

增加列的不同方法

df4["基本工资"]=2500  #通过一个标量添加一整列信息
df4["创造收益"]=df4["销售业绩"]-df4["提成收入"]-df4["基本工资"]  #通过其他列的运算得到新的一列
df4["是否达标"]=df4["创造收益"]>2000
df4["性别"] =pd.Series(["女","男"],index=["001","003"])  #所增加列有未知值时
df4.insert(6,"年龄",[18,19,20])      #在下标为5的列后增加一列,即增加标号为6的列

删除列的三种方法 其中drop更灵活,可决定是否在原表基础上改

df4.pop("年龄")   #基于原表删除
del df4["性别"]   #基于原表删除
df4.drop(columns=["基本工资","是否达标"],inplace=True)  #inplace=True 表示在原表上删除,否则默认不在原表中删除
df4.drop(index=["001","002"])  #删除行用index,删除列用columns

Dataframe的索引和选择之基于标签的索引

基于标签的索引
.loc是基于标签的索引,必须使用数据的标签属性,否则会返回一个异常。
语法:df.loc[行索引,列索引]
如果只索引行信息,所有列信息都保留,索引语法中的列索引信息可以省略
如果只索引列信息,所有行信息都保留,索引语法中的行索引信息不可以被省略,写冒号加逗号表示所有行信息都保留

如果取连续索引

df4.loc["001"]  #如果只索引行信息,所有列信息都保留,索引语法中的列索引信息可以省略
df4.loc["001","员工姓名":"创造收益"]  #行索引,列索引(切片形式取连续几列)
df4.loc["001":"002","员工姓名":"创造收益"]  #取连续几列,连续几行   此时是dataframe形式
df4.loc["004"]=["李雷",60000,12000,np.nan,2500,"男",24,False]  #也可以利用loc增加列,其中未知数据赋np.nan

当取不连续的几列时,将索引打包至一个列表中

df4.loc[["001","003"]]
df4.loc[:,["员工姓名","是否达标"]]
#如果只索引列信息,所有行信息都保留,索引语法中的行索引信息不可以被省略,写冒号加逗号表示所有行信息都保留

基于位置的索引
.iloc是基于位置的索引,传入的参数为目标区域的位置索引。
语法:df.iloc[行索引,列索引]

df4.iloc[1]  #取位置为1的一行
df4.iloc[1,[0,1,3]]   #取位置为1的一行和位置为1,3的列
df4.iloc[:,-1]  #取所有行的最后一列
df4.iloc[0:2]  #基于位置的切片(与基于标签的切片不同),不含最后一个位置,取所有列则列位置省略
df4.iloc[0:2,1:3]
df4.iloc[[1,3],[0,2,3]]  #取不连续的位置。打包为一个列表

布尔型索引
使用布尔向量来过滤选取符合条件要求的数据

df4.提成收入>9000    #返回各行布尔类型
df4[df4.提成收入>9000]  #切片出符合条件行
(df4.提成收入>9000)  & (df4.年龄>25)   #两个条件 与
df4[(df4.提成收入>9000)  & (df4.年龄>25)]  #切片出符合条件
(df4.提成收入>9000)  | (df4.年龄>25)   #两个条件 与
df4[(df4.提成收入>9000)  | (df4.年龄>25)]  #切片出符合条件

DataFrame常用操作

数据查看和描述
查看数据形状 df.shape()
查看数据详细信息 df.info()
简单描述分析 df.describe()

df4.shape #查看数据框的形状,(m,n)
df4.head()  #查看数据框的前几行,默认前5行;也可以指定行数
df4.tail()   #查看数据框的结尾几行,默认后5行;也可以指定行数
df4.index     #查看行索引
df4.columns   #查看列索
df4.info() #查看数据框的详细信息
df4.describe() #进行简单的描述统计
df4.sort_index() #按照行索引升序排序
df4.sort_index(ascending=False) #按照行索引降序排序
df4.sort_values("销售业绩",ascending=False) #按照某一列值排序,默认升序排序,可指定降序;未知值最后
df4.sort_values(["销售业绩","提成收入"],ascending=[False,True])   #顺序一一对应,按照销售业绩降序排序,提成收入升序排序

df4.info() #查看数据框的详细信息
数据预处理03

df4.describe() #进行简单的描述统计
数据预处理03

缺失值处理
缺失值查看 df.isnull()

df4.isnull()    #判断缺失值,返回布尔类型,缺失则true
df4.isnull().sum()   #统计查看各列缺失值数量
df4.isnull().mean()   #查看各列缺失值占比,等同于df4.isnull().sum()/df.shape[0]
df4.销售业绩.value_counts()  #查看某列非缺失值各类数据的数量,主要用于类别数据

填补缺失值 fillna() replace()

df4.fillna(0)   #在缺失值处补0
df4.fillna(df4.mean())   #在各列缺失值处补该列均值,只适用于数值型数据
df4.fillna(method="bfill",limit=1)
#method是一种填充方法,bfill、backfill表示后面往前填(pad/ffill表示前面往后填)默认补完,但可用limit限制填充次数;afill则是前面
df4.replace(np.nan,0)  #用0填充缺失值处
df4.replace(np.nan,df4.median()) #用中位数进行填充
df4.replace(method="ffill")  #等同于df4.fillna(method="ffill")

删除缺失值 df.dropna()

df4.dropna() #默认按照行进行删除,删除存在空值的行
df4.dropna(axis=1)#也可以指定按照列进行删除,删除存在空值的行
df4.dropna(how='all')#按照列进行删除,默认how='any',即删除存在空值的列,all表明删除所有空值的列

数据合并
pd.concat() 一般适用于上下合并
pd.merge() 一般用于左右合并

pd.concat函数

df_1=df4.iloc[:2]  #取原来表前两行,构建新表
df_2=df4.iloc[2:]  #取原来表后面几行,构建新表
pd.concat([df_1,df_2],axis=0)  #上下拼接,注意默认axis=0即按行拼接,=1时按列拼接
pd.concat([df_1,df_2],keys=["df_1","df_2"])  #拼接的同时标注来源
#按列拼接
df_s=df4.iloc[:,:3]  #取所有行前三列构造表
df_h=df4.iloc[:,[0,3,5]]  #取所有行,位置是0,3,5的列组成表
pd.concat([df_s,df_h],axis=1)  #用concat连接列,只将其连接即可,对于重复列并不去重
pd.concat([df_s,df_h],axis=1,keys=["df_s","df_h"],names=["来源表","索引"])

pd.concat([df_s,df_h],axis=1,keys=[“df_s”,“df_h”],names=[“来源表”,“索引”])
数据预处理03
按列合并 pd.merge()函数

pd.merge(df_s,df_h,on="员工姓名")  #不论指定否,默认寻找两个表公共属性列进行连接,同时去重
  #呢么,如果没有公共属性列呢?
df_ss = df_s.copy()
df_ss.columns=["姓名","销售业绩","提成收入"]  #修改公共属性列名,随即不存在公共属性列
pd.merge(df_ss,df_h,left_on="姓名",right_on="员工姓名")   #手动指定依据左表某列和右表某列拼接,只是不去重,因为两列属性名不同

分组运算
df.groupby()

df1
数据预处理03

gp1=df1.groupby("性别")  #按性别分组
len(gp1)   #2   查看分成几组
gp1.size()  #查看各组情况
gp1.mean()   #查看分组后,各个组在某列上的均值,指该列数据为数值类型
gp1["销售业绩"].mean()  #只查看各组销售业绩列的均值
gp2 = df1.groupby(["性别","员工等级"]) #先按照性别分类,然后按照员工等级分类
gp2.size()

数据预处理03

gp2.mean()

数据预处理03

gp3 = df1.groupby(["性别","员工等级"],as_index=False) #as_index=False表示不把作为分组的列明当索引,不注明时默认是作为索引的
gp3.mean()

数据预处理03

gp2=df1.groupby("员工等级")
gp2.size()
gp2.mean()

数据预处理03

gpp=gp2["销售业绩"].agg([np.mean,np.std])  #表示只算销售业绩这一列的均值和方差;也是以dataframe数据类型展示
#给计算出来的两列重命名
gpp.rename(columns={"mean":"平均销售额","std":"标准差"})  #给上面两列重命名

数据预处理03
数据预处理03

gp2.agg({"销售业绩":np.mean,"提成收入":np.std})
#计算销售业绩的均值和提成收入的标准差

数据预处理03

数据透视表
pd.pivot_table()

ts2=pd.pivot_table(df1,values="提成收入",index="性别",columns="员工等级",aggfunc=np.sum)
#处理对象:df1;索引:性别;对提成收入一列进行聚合运算,默认聚合运算是求均值可通过aggfunc指定运算形式;通过columns指定列
#values、index、columns、aggfunc当需要处理多个时都可以打包成元组来实现

数据的读入和导出
读取txt文件

pd.read_csv("E:/test.txt",sep='\t')   #sep设置分隔符
上一篇:com.mysql.cj.jdbc.exceptions.CommunicationsException


下一篇:Mysql优化(3) 索引优化