pandas数据分析之一:数据类型及读写
1.1 pandas模块简介
首先,使用pandas相应的操作之前都需要导入pandas模块
import pandas as pd
import numpy as np #导入pandas和numpy模块
1、pandas中具有两种常见的数据结构:
(1)Series
它是指一维列表或者数组(列向量),和numpy中的array比较类似,可以储存很多不同类型的数据类型;
(2)DataFrame
二维型的数据结构,和Excel表格比较类似,它可以理解为是Series的容器。
1.2 pandas里面的series类型应用:
1、对于series的定义:
s=pd.Series([1,2,3,np.nan,2,3,1,...],index=["a","b","c","d","e"...])
其中对于index是对于每一行数字属性的规定
2、对于series的索引index,其实质是指列表的行标签,可以serie.index来进行查询和输出;
1.3 DataFrame二维列表的相关操作大全
(一)构造DataFrame二维列表的方式
1、对于DataFrame的二维列表数据的出入主要有两种方式:传入二维数组和使用字典的定义方法;
方式一:df=pd.DataFrame(np.random.randn(6,4)) #二维数组的传入方法
方式二:df=pd.DataFrame({"A":[1,2,3,4,5],"B":["1,1,2,1,1"],"C":list("abcde"),"D":["yanjiangyi"]*5}) #字典的传入方式
2、对于二维列表各行各列的属性名称定义主要采用的是index(各行名称)和columns(各列名称):
df=pd.DataFrame(np.random.randn(6,4),index=pd.date_range("20180701",periods=6,freq="M"),columns=[list("abcd")])
3、关于DateFrame的字典数据传入方式,其中字典的key指的是列表的列名称,即columns的取值,另外对于每一列的取值主要有以下六种方式,都可以传入数组:
df=pd.DataFrame({"A":1.0,"B":np.array([3]*4,dtype=int),"C":pd.Timestamp("20190701"),"D":pd.Series([1.21,2.21,3.24,4.26],dtype=float),"E":pd.Categorical(["a","b","c","d"]),"F":"abc"})
(二)DataFrame二维数组的数据的查询
1、头尾数据查询:采用函数.head(x)和.tail(x)可以查询前后x行的数据;
2、查看表格数据的每一列数据类型可以采用df.dtypes来进行查看数据类型;
1.4pandas读取数据及其数据操作
1、pandas读取表格数据的方式是采用自带的函数pd.read_excle(表格的路径)和pd.read_csv(表格的路径)
例如:
df=pd.read_excel("D:/Byrbt2018/Study/Python数据分析课程+练习+讲解/Python数据分析课程+练习+讲解/作业/作业3/作业3/香港酒店数据.xlsx") #表格的读取操作主要依靠的是pd.read_excel/csv函数+文件路径
2、提取表格中的某几行某几列数据的方式:
(1)采用属性名称的方式:
df.loc[行属性A:行属性B,列属性:列属性]
(2)采用表格下标的方式:
df.iloc[行序号:行序号,列序号:列序号]
(3)直接采用数组的方式:
df[[列属性1,列属性2,列属性3...]][行号:行号]
(4)采用标准格式:
df.loc[[index,,...],[columns,,...]] #先行后列
3、表格行的增加和删减
(1)增加一行:
先用字典定义好这一行的新的数据(字典的key是表格的各列属性),然后将其转换为series一维列表,之后采用表格的增添函数df.append(s)来进行添加这一行的数据,另外还可以用s.name来定义新添加行的行属性名称
s={0:"天水宾馆",1:"休闲娱乐",2:"天水",3:"甘谷县",4:"中关村街道",5:4.5,6:11000,7:345} #先定义一行数据,利用字典的操作来进行定义新的一行
s1=pd.Series(s) #转换字典为一维列表
s1.name=420 #定义列表的行属性
(2)删减其中一行:
直接调用pandas模块的删减函数df.drop([行号])函数来进行删减相应需要删减的某一行数据。
4、列的相关操作
(1)列的增加:
列的增加通过直接增加定义就可以:
df["序号"]=range(1,len(df)+1) #增加了序号这一个新的列
(2)列的删减:
列的删减可以通过df.drop["列属性名称",axis=1]来进行操作,其中axis=1必须要设置,他表示删除的是列而不是行,如果不写axis或者设置axis=0,表示的是要进行删减的行:
df.drop["列属性名称",axis=1]
5、有关数据条件选择的操作:
关于数据条件性选择主要可以采用df[(选择条件)]来继续操作,举例如下:
print(df[df.评分>4.5]) #选择评分高于4.5的数据列表
print(df[(df.评分>4.5 )& (df.类型=="浪漫情侣")]) #选择评分高于4.5并且类型属于浪漫情侣的数据列表
print(df[((df.类型=="香港")|(df.日常人数>1000))&(df.评分>4.5)])
#选择类型时香港或者日常人数超过1000人的,并且评分高于4.5的数据列表
6、对于数据缺失值和异常值的处理操作:
(1)缺失值的处理主要包含以下四个操作:
isnull(返回一个布尔型的数据类型,判断是否为缺失值)
notnull(和isnull正好相反,判断不是缺失值)
fillna(对于缺失值进行填充)
dropna(对于缺失值进行相应的删减过滤)
(2)缺失值的处理规则:
#数据缺失值及其异常值的处理
对于缺失值的删减dropna()主要有三个参数:how=all(删掉所有 行和列),inplace=Ture(实时对于删减的表格进行更新),axis=0或者1(删减处理的是行或列)
print(df.isnull())
print(df[df["评分"].isnull()]) #缺失值的判断和输出
#对于缺失值的填充
print(df[df["评价人数"].isnull()]) #首先判断是否有残缺值
df["评价人数"].fillna(np.mean(df["评价人数"]),inplace=True) #缺失值的填充和实时更新inplace=1
print(df)
print(len(df[df["评价人数"].isnull()]))
print(len(df))
print(len(df.dropna()))
df.dropna(inplace=True)
print(len(df))
#异常值的处理
异常值一般主要是判断表格里面的数据是否和列属性的性质不符(比如对于人数属性的列数据存在一小数点负数的情况),然后结合判断的情况进行数据的处理和更新
print(len(df[df["日常人数"]%1!=0])) #对于异常值的判断和处理
df=df[(df["日常人数"]%1==0)&(df["日常人数"]>0)] #根据异常值的条件进行实时更新
print(df)
整体的入门运行代码如下所示(可以直接拷贝运行,含有详细的代码注释,可以轻松帮助你入门理解):
import pandas as pd
import numpy as np #导入pandas和numpy模块
# Series一维列表操作
s=pd.Series([1,2,3,4,np.nan,2,3,4,6,7])
print(s)
print(s.index) #输出series的行标签(属性)
print(s.values) #输出series的取值
print(s[2:9:2]) #隔行输出相应的值(切片操作)
s.index.name="属性" #定义列表series的属性名称
print(s)
s.index=list("abcdefghij") #重新定义表格每一行的属性名字
print(s)
print(s["a":"h":2]) #提取其中一部分,进行相关的的切片操作
# Dataframe二维列表操作大全
date=pd.date_range("20180101",periods=6,freq="D") #生成时间序列
print(date)
df=pd.DataFrame(np.random.randn(6,4),index=date,columns=list("abcd")) #定义随机数的二维列表6x4,然后定义各行各列的名称(index和columns)
df.index.name="date"
print(df)
df1=pd.DataFrame({"A":1.0,"B":np.array([3]*4,dtype=int),"C":pd.Timestamp("20190701"),"D":pd.Series([1.21,2.21,3.24,4.26],dtype=float),"E":pd.Categorical(["a","b","c","d"]),"F":"abc"})
print(df1)
print(df1.values) #查看数据的值
print(df1.index) #查看数据的行属性名称
print(df1.head(3)) #c查看数据的前三行
print(df1.tail(3)) #查看数据的后三行
print(df1.dtypes) #查看表格数据的每一类数据类型
#数据表格的读取与各种操作
df=pd.read_excel("D:/Byrbt2018/Study/Python数据分析课程+练习+讲解/Python数据分析课程+练习+讲解/作业/作业3/作业3/香港酒店数据.xlsx") #表格的读取操作主要依靠的是pd.read_excel/csv函数+文件路径
print(df)
#表格的行操作
print(df.iloc[0]) #采用下标的形式来进行数据的查询df.iloc[:,;]
print(df.iloc[:5]) #采用下标的形式来进行数据的查询df.iloc[:,;]
print(df.loc[0:5,0:3]) #采用行和列属性的形式来进行数据的查询df.iloc[:,;]
#增加一行操作
s={0:"天水宾馆",1:"休闲娱乐",2:"天水",3:"甘谷县",4:"中关村街道",5:4.5,6:11000,7:345} #先定义一行数据,利用字典的操作来进行定义新的一行
s1=pd.Series(s) #转换字典为一维列表
s1.name=420 #定义列表的行属性
print(s1)
df=df.append(s1) #增加一行数据操作(需要重新定义列表)
print(df)
print(df[-5:])
df=df.drop([420]) #删除某一行数据操作(需要重新定义列表)
print(df)
df.columns=["名称","类型","城市","地区","街道","评分","评价人数","日常人数"] #改变表格的各列名称
print(df)
print(type(df.index))
print(df.columns)
print(df["名称"])
#提取某几行某几列数据的三种方法(df.loc[;,;,iloc[;,;],df[[,,][:])
print(df[["名称","类型"]][:5]) #提取某几列某几行
print(df.iloc[0:5,0:3]) #提取某行某列(行在前,列在后)
print(df.loc[1:40,"类型":"评分"])
print(df[["名称","评分","城市"]][0:400:20]) #列在前,行在后
#列的相关操作
df["序号"]=range(1,len(df)+1) #增加列的操作
print(df[:5])
df=df.drop("序号",axis=1) #删减列时采用.drop函数,此时drop(x,axis=1)x表示列的名称,axis=1表示删除的是列,不写axis表示它为0,删除的默认是行
print(df)
print(df.loc[[1,2,3,5,10],["类型","评分"]]) #标准形式提取表格中的数据
#条件选择的数据操作
print(df[df.评分>4.5])
print(df[(df.评分>4.5 )& (df.类型=="浪漫情侣")])
print(df[((df.类型=="香港")|(df.日常人数>1000))&(df.评分>4.5)])
#数据缺失值及其异常值的处理
print(df.isnull())
print(df[df["评分"].isnull()]) #缺失值的判断和输出
#对于缺失值的填充
print(df[df["评价人数"].isnull()]) #首先判断是否有残缺值
df["评价人数"].fillna(np.mean(df["评价人数"]),inplace=True) #缺失值的填充和实时更新inplace=1
print(df)
print(len(df[df["评价人数"].isnull()]))
print(len(df))
print(len(df.dropna()))
df.dropna(inplace=True)
print(len(df))
print(len(df[df["日常人数"]%1!=0])) #对于异常值的判断和处理
df=df[(df["日常人数"]%1==0)&(df["日常人数"]>0)] #根据异常值的条件进行实时更新
print(df)
转自:The-Chosen-One