DateFrame
DataFrame是一个可以包含不同数据类型列的二维数据结构,类似于电子表格或SQL表,或Series对象的字典集合,是最常用的pandas对象。
创建DateFrame
数组创建dataframe
pd.DataFrame(arr2,index=["a","b","c"],columns=["A","B","C","D","E","F","G"])
通过字典创建dataframe 默认键为纵向索引
dict1={'姓名':["小李","小张","小刘","小马"],
'成绩':[95,96,94,97],
'加权':[87.5,88.1,89.6,90.1]}
df2=pd.DataFrame(dict1)
增添横向索引用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')
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)
增加列的不同方法
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() #查看数据框的详细信息
df4.describe() #进行简单的描述统计
缺失值处理
缺失值查看 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=[“来源表”,“索引”])
按列合并 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
gp1=df1.groupby("性别") #按性别分组
len(gp1) #2 查看分成几组
gp1.size() #查看各组情况
gp1.mean() #查看分组后,各个组在某列上的均值,指该列数据为数值类型
gp1["销售业绩"].mean() #只查看各组销售业绩列的均值
gp2 = df1.groupby(["性别","员工等级"]) #先按照性别分类,然后按照员工等级分类
gp2.size()
gp2.mean()
gp3 = df1.groupby(["性别","员工等级"],as_index=False) #as_index=False表示不把作为分组的列明当索引,不注明时默认是作为索引的
gp3.mean()
gp2=df1.groupby("员工等级")
gp2.size()
gp2.mean()
gpp=gp2["销售业绩"].agg([np.mean,np.std]) #表示只算销售业绩这一列的均值和方差;也是以dataframe数据类型展示
#给计算出来的两列重命名
gpp.rename(columns={"mean":"平均销售额","std":"标准差"}) #给上面两列重命名
gp2.agg({"销售业绩":np.mean,"提成收入":np.std})
#计算销售业绩的均值和提成收入的标准差
数据透视表
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设置分隔符