pandas对象
pandas有俩对象,一个是series,一个是dataframe。
series
series是一维的,并且只储存相同的数据类型的元素,有两个属性,分别是index(索引,也叫数据标签)和values(保存了元素值的ndarray数组),可见,pandas是建立在numpy的基础之上的。
series对象可以由列表生成:
import pandas as pd a = pd.Series([1, 5, 6]) print(a)
结果如下:
可以看见,默认会在左侧生成从零开始的索引。
也可以自己制定索引:
import pandas as pd a = pd.Series([1, 5, 6], index=('c', 'b', 'm')) print(a)
也可以用字典创建
其中,如果使用字典创建,也可以继续用index参数,输出结果是index查找的元素。
也可以使用ndarray创建
这里的series可以用numpy函数进行操作。
同时,加减乘除的操作会根据index自动对齐。
dataframe
其对象表示的是矩阵的数据结构,这种数据结果类似excel表格。
它由按一定顺序排列的多列数组组成,其中每列数据类型必须一致(各个列之间可以不同)
它有行索引和列索引,可以看作一个具有共同索引的series字典。
它有仨属性:data,index,columns ,表示数据(还是ndarray数组啦),行索引和列索引。
创建方法和series差不多,列表创建(不指定index和columns默认从0开始):
直接上图,直观又清晰。
字典创建也可以:
如果指定index:
import pandas as pd import numpy as np a = pd.DataFrame({'chinese': [59, 89, 99], 'english': [87, 56, 22], 'math': [66, 78, 150]},index=['xiaoli', 'wangfang', 'zhangqiang']) print(a)
结果:
当然,使用字典也可以嵌套,py会根据键来作为索引,第一个键是列索引
注意
只有使用字典创建,后面的index的数目才可以与前面不保持一致,因为字典已经默认创建了索引。dataframes的字典键默认是列索引,因为series是一列数据,而dataframes可以由series字典创建。
其中abc会根据索引自动对齐
索引 对象
a.index读取a的索引对象,生成一个由a的索引组成的不可变数组,这个数组有两个属性,values和name,其中values是列表,name是名字。例如:
import pandas as pd import numpy as np d = pd.DataFrame({'chinese': {'zhangqiang': 55, 'lili': 44, 'zcz': 0}, 'math': {'zhangqiang': 77, 'lili': 46, 'zcz': 0}, 'english': {'zhangqiang': 55, 'lili': 22, 'zcz': 0}}) m = pd.Index(d.index.values, name='name') k = pd.Index(d.columns.values, name='objects') f = pd.DataFrame(d, index=m, columns=k) print(f)
这其中的pd.Index()函数是生成一个index对象,同样有俩属性,values和name
multIndex多级索引
简单来讲就是索引也是可以分层的。
a = pd.Series([1,2,3,4,5,6],index=[['one','one','one','two','two','two'],['a','b','c','d','e','f']])
这样子它左列的index就分了两层
为了更加直观记录,下面附图:
数据存储,也就是索引和切片啦
【】储存
对于series对象,就是
Series对象的下标存取。
单个标签
标签切片
标签列表
单个整数下标
整数下标列表
整数下标切片
#布尔数组 In[47]:ser[[True,False,False]]
与Series对象类似,通过[]运算符也可以对DataFrame对象进行存取。DataFrame对象既有行索引也有列索引,但是对DataFrame对象通过[]运算符进行存取时,主要是针对列索引进行操作,支持下面几种下标对象。
① 单个标签:获取标签对应的列,返回Series对象。
② 标签列表:获取标签列表中多个标签对应的列构成的DataFrame对象。
③ 整数下标切片:获取切片中对应的多行构成的DataFrame对象,整数下标切片不包含终值。
④ 标签切片:获取切片中对应的多行构成的DataFrame对象,标签切片包含终值。
⑤ 布尔数组:获取布尔数组中为True的对应的行构成的DataFrame对象。
⑥ 布尔DataFrame:将DataFrame对象中False对应的元素设置为NaN。
df.loc[ ]存储
若.loc[]存取器的下标对象若是一个元组,则元组中的两个元素分别与DataFrame对象的两个轴对应,这时是对DataFrame对象中的某个元素(元组位置对应的元素)进行存取;若下标对象不是一个元组,且只有0轴,则是对DataFrame对象的行进行存取,若只有1轴,则是对DataFrame对象的列进行存取。
df.loc【‘chinese’,‘zhangqiang’】
#.loc[]下标对象不是元组,且只有0轴,则取某行
df.loc["zhangqiang"]
#.loc[]下标对象不是元组,且只有1轴,则取某列
df.loc[[:,"Math"]]
除此之外,.loc[]存取器的每个轴的下标对象除了支持单个标签外,还支持标签列表、标签切片及布尔数组。
df.iloc[ ]存储
.iloc[]存取器的下标是标签元组、标签切片、标签列表等,而.iloc[]的下标是位置下标,也就是整数下标。
df.ix [ ]存储
上述两种存储器的结合体。
逻辑条件索引
可以属于布尔数组索引,也可以有&且和|或的逻辑
df[(df['Math'] > 80) & (df['English'] > 80)]
当然也可以使用NumPy中的logical_and()(逻辑与)、logical_or()(逻辑或)、logical_xor()(逻辑异或)函数,完成同样的功能。
df[np.logical_and(df['Math']> 80,df['English']>80)]
除了使用布尔数组进行逻辑条件存取外,还可以使用一些函数快速进行逻辑条件存取。isin()、query()这些都行。
isin()函数根据特定值选择,返回满足条件的新的DataFrame对象。
df[df.Math.isin([87, 89])]
输出math里等于87,89的
query()函数的参数是一个表达式字符串,字符串中可以使用and、not、or等关键字进行向量布尔运算,表达式中的变量名就是对应的列标签名。
df.query("Math>80 and English>80"))
感觉这个最好用qwq
文件读写
csv读写
读取CSV文件的两个主要函数是read_csv()和read_table()。它们都使用相同的解析代码来智能地将表格数据转换为DataFrame对象。
read_csv()
下面是其参数说明
excel读写
pd.read_excel(io,sheetname=0,header=0,skiprows=None,index_col=None,names=None,arse_cols=None,date_parser=None,na_values=None,thousands=None,convert_float=True,has_index_names=None,converters=None,dtype=None,true_values=None,false_values=None,engine=None,squeeze=False,**kwds)
HDF5文件读写
HDF5(Hierarchical Data Format Version 5,分层数据格式版本5)是存储科学数据的一种文件格式,文件扩展名为.h5。它以C库的形式提供,因此存取速度非常快,且可在文件内部按照明确的层次存储数据(HDF5中“HDF”表示的就是分层数据格式)。HDF5还具有很多其他语言的接口,如Java、MATLAB和Python等。
HDFS文件像一个保存数据的文件系统,其中有两种类型的数据对象。
① 资料数据(dataset):类似文件系统中的文件,可以为用户保存数据。
② 目录(group):类似文件系统中的文件夹,可以包含其他的目录和资料数据。
HDFStore
Pandas中的HDFStore构造函数用于生成管理HDF5文件I/O操作的对象,其主要参数如下。
① path:字符型输入,用于指定HDF5文件的名称(不在当前工作目录时需要带上完整路径信息,并且注意文件分隔符\的转义问题)。
② mode:用于指定I/O操作的模式,与Python内置的open()函数中的参数一致,默认为'a'模式,即当指定文件已存在时不影响原有数据写入,指定文件不存在时则新建文件;'r'为只读模式;'w'为创建新文件(会覆盖同名旧文件);'r+'模式与'a'作用相似,但要求文件必须已经存在。
③ complevel:int型,用于控制HDF5文件的压缩水平,取值范围为0~9。值越大则文件的压缩程度越大,占用的空间越小,但相应地,在读取文件时需要更多解压缩的时间成本。默认为0,代表不压缩。
④ complib:指定压缩格式,HDF5文件的存储支持压缩模式,使用的压缩模式是blocs,其速度最快,也是Pandas默认支持的压缩格式。使用压缩可以提高磁盘利用率,节省空间。
例如:
a = pd.HDFStore("data.h5",complib="blosc",complevel=9)
接下来创建Pandas中不同的两种对象Series和DataFrame,并将它们共同保存到store对象中。HDFStore对象支持字典接口,因此可以利用键值对将不同的数据存入store对象中,也可以使用store对象的put()函数将数据存入store对象中,store对象的put()函数的主要参数如下。
① key:指定HDF5文件中待写入数据的key。
② value:指定与key对应的待写入的数据。
③ format:字符型类型,用于指定写入的模式,'fixed'对应的模式速度快,但是不支持追加也不支持检索;'table'对应的模式以表格的模式写入,速度稍慢,但是支持直接通过store对象进行追加和表格查询操作。
data1=[23,24,25]
index=pd.Index(['zhangsan','lisi','wangwu'],name="name") ser=pd.Series(data=data1,index=index)
data=[{'Chinese':81,'English':74,'Math':87},{'Chinese':92,'English':85,'Math':78},{'Chinese':83,'English':96,'Math':89}]
df = pd.DataFrame(data,index=['zhangsan','lisi','wangwu'])
#采用键值对方式将ser写入store中
store["data/ser1"]=ser
#采用put()函数把df写入store中
store.put(key= "data/df1 ",value=df)
运算
大部分和numpy差不多。特别的,当df与ser进行运算时,默认是与行进行(类似多维numpy与一维numpy),遵循广播原则
排序:
ser.sort_values()
‘’‘降序'''
ser.sort_values(ascending=False))
df根据某一特定值排序:
df.sort_values(by="Math")
排名是根据Series对象的值或DataFrame对象的某几列的值进行排名,Pandas中的rank()函数可以帮助我们完成排名。该函数的参数主要有ascending和method。ascending默认为True,表示升序,如果希望降序则设置ascending=False即可;method参数是说明数据相同时的排序的方法
汇总和统计: