0 简单介绍
pandas是一个Python语言的软件包,在我们使用Python语言进行机器学习编程的时候,这是一个非常常用的基础编程库。本文是对它的一个入门教程。
pandas提供了快速,灵活和富有表现力的数据结构,目的是使“关系”或“标记”数据的工作既简单又直观。它旨在成为在Python中进行实际数据分析的高级构建块。
另外,pandas常常和NumPy一起使用,本文中的源码中也会用到NumPy(教程见Python 机器学习库 NumPy 教程)。
1 安装
pip install pandas
2 核心数据结构
pandas最核心的就是Series
和DataFrame
两个数据结构。
这两种类型的数据结构对比如下:
名称 | 维度 | 说明 |
---|---|---|
Series | 1维 | 带有标签的同构类型数组 |
DataFrame | 2维 | 表格结构,带有标签,大小可变,且可以包含异构的数据列 |
DataFrame可以看做是Series的容器,即:一个DataFrame中可以包含若干个Series。
3 Index对象与数据访问
pandas的Index对象包含了描述轴的元数据信息。当创建Series或者DataFrame的时候,标签的数组或者序列会被转换成Index。
请注意:
Index并非集合,因此其中可以包含重复的数据
Index对象的值是不可以改变,因此可以通过它安全的访问数据
DataFrame提供了下面两个操作符来访问其中的数据:
loc
:通过行和列的索引来访问数据
iloc
:通过行和列的下标来访问数据
3.1 基础方法:[]
和.
series1 = pd.Series[1, 2, 3, 4, 5, 6, 7], index=["C", "D", "E", "F", "G", "A", "B"]) print"series1['E'] = {} ".formatseries1['E'])); print"series1.E = {} ".formatseries1.E));
结果:
注1:对于类似属性的访问方式.
来说,要求索引元素必须是有效的Python标识符的时候才可以,而对于series1.1
这样的索引是不行的。
注2:[]
和.
提供了简单和快速访问pands数据结构的方法。这种方法非常的直观。然而,由于要访问的数据类型并不是事先知道的,因此使用这两种方法方式存在一些优化限制。因此对于产品级的代码来说,pandas官方建议使用pandas库中提供的数据访问方法。
3.2 loc与iloc
loc
:通过行和列的索引来访问数据
iloc
:通过行和列的下标来访问数据
通过这两个操作符我们还可以访问某个范围之内的数据。
3.3 at与iat
这两个操作符用来访问单个的元素值(Scalar Value)。类似的:
at
:通过行和列的索引来访问数据
iat
:通过行和列的下标来访问数据
3.4 Index对象
Index提供了查找,数据对齐和重新索引所需的基础数据结构。
我们可以通过一个数组来创建Index对象。在创建的同时我们还可以通过name
指定索引的名称:
index = pd.Index['C','D','E','F','G','A','B'], name='note')
3.5 MultiIndex
MultiIndex,或者称之为Hierarchical Index是指数据的行或者列通过多层次的标签来进行索引。
4 Series数据对象
4.1 Series数据对象的生成
Series是一维结构的数据,Series的数据类型有list、ndarray、字典、常量;
以下结果中:
输出的最后一行是Series中数据的类型,这里的数据都是int64
类型的。
数据在第二列输出,第一列是数据的索引,在pandas中称之为Index
。
list
data=[-2,-1,0,1,2] index=["a","b","c","d","e"] s1=pd.Seriesdata,index=index) prints1)
结果:
ndarray
data=np.random.randn5) index=["a","b","c","d","e"] s2=pd.Seriesdata,index=index) prints2)
结果:
字典
data={'a':0,'b':1,'c':2} index=["a","b","c","d","e"] s3=pd.Seriesdata,index=index) prints3)
结果:
常量
data=5 index=["a","b","c","d","e"] s4=pd.Seriesdata,index=index) prints4)
结果:
如果不指定(像上面这样),索引是[a, …,z]的形式。不过我们也可以在创建Series的时候指定索引。索引未必一定需要是整数,可以是任何类型的数据,例如字符串。
4.2 Series数据对象的访问
Series的访问方法:s.values、s.index、索引访问、切片访问
prints3.values) prints3.index) prints3[['a','b']]) #prints3['a']) prints3[:3])
结果:
5 DataFrame数据对象
5.1 DataFrame数据对象的生成
DataFrame的数据类型有列表组成的字典、嵌套列表、二维ndarray、Series组成的字典、字典的列表、字典组成的字典等;DataFrame默认的索引和列名都是[0, N-1]的形式。
列表组成的字典
data={'one':[1,2,3,4],'two':[5,6,7,8]} df1=pd.DataFramedata) printdf1)
结果:
嵌套列表
data=[[1,2,3,4],[5,6,7,8]] df2=pd.DataFramedata,index=['a','b'],columns=['one','two','three','four']) printdf2)
结果:
二维ndarray
data=np.zeros2,),dtype=['A','i4'),'B','f4'),'C','a10')]) printdata) df3=pd.DataFramedata) printdf3)
结果:
Series组成的字典
DataFrame的不同列可以是不同的数据类型;如果以Series数组来创建DataFrame,每个Series将成为一行,而不是一列。
data={'one':pd.Series[1,2,3],index=['a','b','c']), 'two':pd.Series[4,5,6],index=['b','c','d'])} df4=pd.DataFramedata) printdf4)
结果:
字典的列表
data=[{'a':1,'b':2},{'a':4,'b':4,'c':5}] df5=pd.DataFramedata) printdf5)
结果:
字典组成的字典
data={'a','b'):{'A','B'):1,'A','C'):2}, 'a','a'):{'A','C'):3,'A','B'):4}, 'a','c'):{'A','B'):5,'A','B'):6}, 'b','a'):{'A','C'):7,'A','B'):8}, 'b','b'):{'A','D'):9,'A','B'):10} } df6=pd.DataFramedata) printdf6)
结果:
5.2 DataFrame数据对象的访问
printdf1) printdf1.index) printdf1.columns) print) printdf1.values) print) printdf1['one']) # printdf[['one']]) 此写法带列标 print) printdf1[0:1]) printdf1.loc[:,['one','two']]) print) printdf1.loc[[0],['one','two']]) print) printdf1.iloc[0:2,0:1]) print) printdf1.ix[0,['one','two']]) print) printdf1.ix[[0,1],[0,1]])
结果:
6 数据整合
6.1 Concatenate:串联,连接,级连
6.2 Append:附加,增补
6.3 Merge:融合,归并,合并
6.4 Join:合并,接合,交接
7 文件操作
pandas库提供了一系列的read_
函数来读取各种格式的文件,它们如下所示:
7.1 读取Excel文件
注:要读取Excel文件,还需要安装另外一个库:
xlrd
df1 = pd.read_excel"data/test.xlsx")
7.2 读取CSV文件
df2 = pd.read_csv"data/test1.csv")
8 处理无效值
8.1 忽略无效值
通过pandas.DataFrame.dropna
函数抛弃无效值
8.2替换无效值
通过fillna
函数将无效值替换成为有效值
9 实例:使用pandas_datareader获取股票数据并处理
# -*- coding: utf-8 -*- """ Created on Wed Jun 5 20:20:47 2019 @author: quanzhan """ import numpy as np import pandas as pd import pandas_datareader.data as web import datetime #获取股票数据方法一: #df_csvsave=web.DataReader'601233.SS','yahoo',datetime.datetime2019,6,1),datetime.date.today)) #保存到csv #df_csvsave.to_csv'D:\AnacondaProjects\learnnumpy\exchange_06.csv',columns=df_csvsave.columns,index=True) #获取股票数据方法二: df_csvload=pd.read_csv"D:\AnacondaProjects\learnnumpy\exchange_06.csv",parse_dates=True,index_col=0,encoding='gb2312') print"***************************************************") printdf_csvload) print"***************************************************") printdf_csvload.index) printdf_csvload.columns) print"*****#股票内容查看: head)、tail)、shape、describe)、info)*********") #股票内容查看: head)、tail)、shape、describe)、info) printdf_csvload.head3)) printdf_csvload.tail3)) printdf_csvload.shape) printdf_csvload.describe)) printdf_csvload.info)) print"*******# 缺失值处理:isnull)、notnull)、dropna)、fillna)**********") # 数据规整化处理 # 缺失值处理:isnull)、notnull)、dropna)、fillna) printdf_csvload.isnull)) # .T.any)非缺失值仍然显示 printdf_csvload.notnull).T.any)) # axis=0删除包含缺失值的行 axis=1 删除包含缺失值的列 how='all' 所有值均缺就删除 how='any'只要有一个缺失值就删除 printdf_csvload.dropnaaxis=0,how='all')) # method='ffill'行或列上的上一个值来填充缺失值 inplace=True 改变原来的dataFrame printdf_csvload.fillnamethod='ffill',axis=0,inplace=True)) print"***************# 精度转换 :(1) '%0.2f'%x******************") # 特殊值处理 # 精度转换 :(1) '%0.2f'%x df_csvload1=df_csvload.applymaplambda x:'%0.3f'%x) df_csvload1.Volume=df_csvload.ix[:,['Volume']].applylambda x:'%0.0f'%x,axis=1) printdf_csvload1) print"******************# 精度转换 :(2)*********************************") # 精度转换 :(2) df_csvload2=df_csvload.round1) df_csvload2.Volume=df_csvload2.Volume.astypeint) printdf_csvload2) print"****************# 特定值查询后用此列的中位数填充*********************") # 特定值查询后用此列的中位数填充 printdf_csvload) print) printdf_csvload[df_csvload.values==0]) df_csvload.loc[df_csvload.loc[:,'High']==0,'High']=df_csvload.High.median) print) printdf_csvload)
参考