本文目录
1. pandas是什么
- panel(面板)+data(数据)+analysis(分析)
- 2008年WesMcKinney开发的专门用于数据分析/挖掘的开源第三方python库;
- 它以Numpy为基础,具备Numpy模块在计算方面的高性能优势,并封装了matplotlib库的图表绘制功能;
- 它有自己独特的数据结构DataFrame,可以实现丰富的数据处理功能。
2. pandas的优势
- 高效便捷的数据处理能力;
- 简便易用的文件读取能力;
- 封装了Numpy和Matplotlib的计算和绘图能力。
3. pandas的核心数据结构DataFrame
3.1 DataFrame结构
- DataFrame是一个类似二维表格的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值等);
- DataFrame既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)
- 行索引,表明不同行,横向索引,叫‘index’
- 列索引,表名不同列,纵向索引,叫‘columns’
3.1.1 DataFrame的创建语法
#导入第三方库importnumpyasnpimportpandasaspd#先用numpy按正态分布随机生成一份值在0到1之间的2行3列的数据data=np.random.normal(0,1,(2,3)) #将上面生成的数据构造为DataFrame结构df=pandas.DataFrame( data, index, columns, dtype, copy) /*参数说明:data:一组数据(ndarray/series/map/lists/dict等类型)。index:行索引,或称行标签,默认为RangeIndex (0,1,2,…,n)。columns:列索引,或称标签,默认为RangeIndex (0,1,2,…,n)。dtype:数据类型。copy:拷贝数据,默认为False。*/
3.1.2 DataFrame的常用属性
df.shape#dataframe的行数和列数,结果为一个元组(行数,列数)df.index#dataframe的行索引列表df.columns#dataframe的列索引列表df.values#dataframe的数据值,结果为一个数组arraydf.T#行列转置
3.1.3 DataFrame的常用方法
df.head(n) #前n行,默认前5行,常用于预览数据df.tail(n) #后n行,默认后5行
3.1.4 DataFrame索引的设置
#修改行列索引值,不能单独修改,须整列索引一起修改df.index=new_index#重置行索引,drop默认为False,会删掉旧索引df=df.reset_index(drop=True) #设置新索引,key为新索引名的列表,可指定某列或某几列作为新索引,drop默认为False,会删掉旧索引new_df=df.set_index(key,drop=True)
将单列的值设置为行索引时,行索引是Index;将多列的设置为行索引时,行索引是MultiIndex,可以用来表示三维数据。
3.2 MultiIndex与Panel
MultiIndex是多级或分层索引对象,可存储多维数据。
#MultiIndex的index属性new_df.index.names#每级或每层的名称new_df.index.levels#每级或每层的元组值
Panel是存储三维数据的容器。panel是dataframe的容器。
#Panel的创建p=pd.Panel(np.arange(24),reshape(4,3,2),items='abcd',major_axis=pd.date.range('20200101',periods=3),minor_axis=['first','second']) /*参数说明:items:axis=0,每个panel对应于内部包含的数据帧(dataframe)major_axis:axis=1,每个数据帧(dataframe)的行索引minor_axis:axis=2,每个数据帧(dataframe)的列索引*//*三维数据无法直接展示,打印出来只能看到描述信息,但可以查看某一维度下的dataframe*/p['a'] #查看items=a的dataframep.major_xs('20200101') #查看major_axis='20200101'的dataframep.minor_xs('first') #查看minor_axis='first'的dataframe
注:pandas从0.20.0版本开始弃用panel,转而推荐使用DataFrame上的MultiIndex方法来表示3D数据。
3.3 Series
Series是带索引(index)的一维数组,dataframe是series的容器。
3.3.1 创建Series
#1、通过已有数据创建sr1=pd.Series(np.arange(10)) #指定内容,默认索引(从0开始的整数序列)sr2=pd.Series(np.arange(5),index=[1,2,3,4,5]) #指定内容和索引#2、通过字典数据创建sr3=pd.Series({'red':100,'bule':50,'green':20,'yellow':10})
3.3.2 获取Series的索引和值
#获取Series sr1 的索引sr1.index#获取Seriex sr1 的值sr1.values
4. pandas的基本数据操作
数据准备
#从csv文件中读取数据data=pd.read_csv('./stock_day/stock_day.csv') #"."表示当前目录开始,".."表示从父目录开始#删除一些列data=data.drop('ma5','ma10','ma20','v_ma5',axis=1) #axis=1表示列,axis=0表示行
4.1 索引操作
Numpy 中支持使用索引选取序列和切片选择,pandas也支持类似的操作,也可以直接使用列名、行名称,甚至组合使用。
#1、直接使用行列索引(先列后行)print(data['列名']['行名(数)']) #若行列顺序搞反会报错#2、按名字索引(loc,行列不分顺序)print(data.loc['列名']['行名(数)']) print(data.loc['列名','行名(数)']) print(data.loc['行名(数)','列名']) #3、按数字索引(iloc,先行后列)print(data.iloc[1,0]) #第二行第一列的值#4、组合索引(名字索引和数字索引混用,即将过时)print(data.ix[:4,['列名1','列名2']])#获取列1列2前4行的数据#用loc实现print(data.loc[data.index[0:4],['列名1','列名2']] #用iloc实现print(data.iloc[0:4,data.columns.get_indexer(['列名1','列名2'])])
4.2 赋值与排序
赋值操作
#对DataFrame中的某列进行整列重新赋值为1data['列名']=1#或者data.列名=1#修改第2行第1列单元格的值为1data.iloc[1,0]=1
排序操作
(1)对内容进行排序
1.1)DataFrame,使用df.sort_values(by=,ascending=)对内容进行排序,单个键或者多个键进行排序,默认升序。by=列名或多个列名的列表;ascending=False:降序,ascending=True:升序。
#将dataframe数据按某列的值的降序排列df=df.sort_values(by='列名',ascending=False) #将dataframe数据按多列的值的升序排列df=df.sort_values(by=['列名1','列名2'])
1.2)Series使用sr.sort_values(ascending=True)对内容进行排序,因为series只有一列,所以排序时不需要指定列名参数。ascending=False:降序,ascending=True:升序,默认升序。
#将series数据按降序排列sr=sr.sort_values(ascending=False)
(2)对索引进行排序
按索引进行排序时,DataFrame和Series的排序方法一致。都是使用.sort_index(ascending=)来进行排序,ascending=False:降序,ascending=True:升序,默认升序。
#将dataframe或series数据按索引降序排序df['列名'].sort_index(ascending=False)
4.3 数据运算
Series和DataFrame数据的运算方法类似。
4.3.1 算术运算
算术运算符主要是+、-、*、/等,对应的函数为add(数值)、sub(数值)、mul(数值)、div(数值)。
ps:使用函数时可以与head()函数一起使用。
##将整个dataframe或series数据df加上10df+10#或者df.add(10) ##将某列的值加10df['列名'].add(10) ##列1-列2df['列1']-df['列2'] #或者df['列1'].sub(df['列2'])
4.3.2 逻辑运算
逻辑运算符有<、>、|、&等。
逻辑运算函数有query()、isin()等。
逻辑运算的结果为布尔值,即True或False。
##单条件筛选:筛选列1的值大于2的全表数据df[df['列1']>2] #或者df.query("列1 >2") ##多条件筛选:筛选列1的值大于2且列2的值为“中国”的全表数据df[(df['列1']>2) & (df['列2']=='中国')]#需加(),否则可能会报错#或者df.query("列1 > 2 & 列2 == '中国' ") #isin()函数:判断是否包含某些值,筛选列1的值为中、美、俄的全表数据df[df['列1'].isin(['中','美','俄'])]
4.4 统计运算与自定义运算
4.4.1 统计运算
1)综合统计函数
describe()函数:可以一次性计算出count(计数)、mean(平均值)、std(标准差)、min(最小值)、25%(四分位数)、50%(中位数)、75%(四分之三分位数)、max(最大值)。
2)数值统计函数
max():最大值
min():最小值
median():中位数
std():标准差
var():方差
……
以上函数均默认(axis=0),即按列“columns”统计 ,如果要按行“index"进行统计,需要指定(axis=1)。
3)统计索引函数
idxmax():最大值对应的索引
idxmin():最小值对应的索引
4)累计统计函数
cumsum():从首行到当前行的累计求和,即:1+2+……+n
cummax():从首行到当前行的累计最大值,即:max(1,2,……,n)
cummin():从首行到当前行的累计最小值,即:min(1,2,……,n)
cumprod():从首行到当前行的累计乘积,即:1*2*……*n
#对df表进行综合统计df.describe() #对列1进行求和df['列1'].sum() #获取列1最大值对应的索引df['列1'].idxmax() #对列1进行累计求和df['列1'].cumsum() #对列1按索引排序后再进行累计求和df['列1'].sort_index().cumsum()
4.4.2 自定义运算
自定义函数:apply(func),func:自定义函数体,默认按列计算,即axis=0,若要按行计算,需指定axis=1。
#定义一个对列做最大值-最小值计算的函数df.apply(lambdax:x.max()-x.min())
5. pandas绘图
绘图函数:
pandas.DataFrame.plot(x=None,y=None,kind='line')
(x:x轴;y:y值;kind:图表类型,line--折线图(默认),bar--垂直条形图,barh--水平条形图,hist--直方图,pie--饼图,scatter--散点图)
#绘制列1和列2的散点图df.plot(x='列1',y='列2',kind='scatter')
6. pandas的文件读取与存储
数据的存储格式多种多样,pandas支持读取和存储的文件格式非常丰富,如 CSV、SQL、XLS、XLSX、JSON、HDF5等,其中最常用的有HDF5/CSV/JSON。
6.1 CSV
6.1.1 读取csv文件
pandas.read_csv(filepath_or_buffer,sep=',',usecols=None,names=None),filepath_or_buffer:文件路径,sep:指定分隔符,默认为英文逗号,usecols:指定列名,列表形式,names:指定字段名称,当csv无列名或需要重命名列名时使用,字段数需与csv列数和顺序均一致。
#读取csv文件df=pandas.read_csv('',usecols=['a','m','de'])
6.1.2 存储为csv文件
df.to_csv (path_or_buf=None, sep=', ', columns=None, header=True, index=True, mode='w', encoding=None),path_or_buf:文件名;sep:指定分隔符,默认为英文逗号;columns:指定列索引,列表形式;header:是否写入列索引,默认True写入,若不需要写入则指定为False;index:是否写入行索引,默认True写入,若不需要写入则指定为False;mode:模式,'w'--覆盖写,'a'--追加写;encoding:指定编码格式。
#覆盖写模式存储csv文件df.to_csv('D:\test\test.csv',mode='w')
6.2 HDF5
6.2.1 读取hdf5文件
HDF5是一种二进制文件,读取和存储时需要指定一个键,值为要存储的dataframe,因此可以理解为HDF5可以存储三维数据。
pandas.read_hdf(path_or_buf,key=,mode=''),path_or_buf:文件的路径;key:读取的键。
#读取HDF5文件,只有1个键时,可以不用指定读取的键。有多个键时,需要指定,否则会报错。df.read_hdf('d:\test\test.h5') '''如果读取的时候出现错误:ImportErrorv RDFStore requires PyTables。“No module named ‘tables’ " problem importing是因为没有装“tables”这个库,这个库就是用来支持读取 HDF5 文件的。'''
6.2.2 存储为hdf5文件
df.to_hdf(path, key = ),path:文件名和路径,key:保存的键,必填。
#存储为HDF5文件df.to_hdf('d:\test\test.h5',key='a')#不加key会报错
6.3 JSON
json是前后端交互时常用的数据格式,也会用于存储。pandas也支持对该数据格式的读取和存储。
6.3.1 读取json文件
pandas.read_json(path_or_buf=None,orient='records',type='frame',lines=Fales),orient:告诉API以怎样的格式展示读取的 json文件;type:指定转换成的数据类型frame或series,默认'frame';lines:是否按行读取,默认False。
#读取json文件pandas.read_json('d:\test\test.json',orient='records',lines=True)
6.3.2 存储为json文件
df.to_json(path),需要用到的参数(与读取相同):orient = 'records',lines = True/False。
#将df存储为json格式df.to_json('d:\test\test.json',orient='records',lines=True)#若lines默认False,保存的数据将会比较乱