python3 科学计算之pandas入门(一)
一.Pandas简介
Pandas(Python Data Analysis Library)基于Numpy构建,让基于Numpy的应用更简单,被广泛应用于金融行业,流行的数据分析工具
二.Pandas安装
由于Pandas是python的第三方库,需要另外安装
pip3 install pandas
三.Pandas的数据结构
Pandas主要有两种数据结构:
- 系列(
Series
) - 数据帧(
DataFrame
)
系列(Series
)是能够保存任何类型的数据(整数,字符串,浮点数,Python对象等)的一维标记数组。轴标签统称为索引。
数据帧(DataFrame)是二维数据结构,即数据以行和列的表格方式排列。
数据帧(DataFrame)的功能特点:
- 潜在的列是不同的类型
- 大小可变
- 标记轴(行和列)
- 可以对行和列执行算术运算
四.各个数据结构示例
1.Series
1)创建Series
import pandas as pdobj=pd.Series([1,3,24,23,8])print(obj)print(obj.values)print(obj.index)print(obj[3])
2)自定义index
obj=pd.Series([1,3,8,24,23],index=['a','b','c','d','e'])print(obj)print(obj.index)print(obj['d'])也可以重新索引,如果某个索引值当前不存在,就引入缺失值,
In [10]: obj2=obj.reindex(['b','c','d','f','g'])
In [11]: obj2
Out[11]:
b 3.0
c 8.0
d 24.0
f NaN
g NaN
dtype: float64
对于缺失值,可以填充其他值
In [12]: obj2=obj.reindex(['b','c','d','f','g'],fill_value=0)
In [13]: obj2
Out[13]:
b 3
c 8
d 24
f 0
g 0
dtype: int64
3)使用字典创建Series
dic={'calvin':7,'kobe':24,'mj':23,'kd':35}print(pd.Series(dic))
2.DataFrame
data={'name':['calvin','kobe','michale','durant','james'],'age':[29,40,56,30,34],'height':[1.70,1.98,1.98,2.06,2.03]} #从字典创建DataFramedata2=[['a',1],['b',2],['c',3]] #从列表创建DataFramedata3 = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']), 'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])} #从系列的字典来创建DataFramedd = pd.DataFrame(data3)df=pd.DataFrame(data2,columns=['name','age']) #加入列标签dd['three']=pd.Series([10,20,30],index=['a','b','c']) #增加列del dd['one'] #删除列print(pd.DataFrame(data))print(df)print (dd) print(dd['one']) #列选择print(dd.loc['b']) #行选择(标签选择)print(dd.iloc[1]) #行选择(按整数位置选择)print(dd[0:2]) #行切片
下表列出了DataFrame构造函数所能接受的各种数据: 类型 说明二维ndarray 数据矩阵,还可以传入行标和列标由数组、列表或元组组成的字典 每个序列会变成DataFrame的一列。所有序列的长度必须相同Numpy的结构化/记录数组 类似于“由数组组成的字典”由Series组成的字典 每个Series会成为一列。如果没有显示指定索引,则各Series的索引会被合并成结果的行索引由字典组成的字典 各内层字典会成为一列。键会被合并成结果的行索引,跟“由Series组成的字典”的情况一样字典或Series的列表 各项将会成为DataFrame的一行。字典键或Series索引的并集将会成为DataFrame的列标由列表或元组组成的列表 类似于“二维ndarray”另一个DataFrame 该DataFrame的索引将会被沿用,除非显式指定了其他索引Numpy的MaskedArray 类似于“二维ndarray”的情况,只是掩码值在结果DataFrame会变成NA/缺失值
五.读取Excel文件&CSV文件
新建一个测试用的Excel,命名为
google.xlsx
并加入一些数据,放入到pycharm工程目录下,数据如下图:
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltdata=pd.read_excel("google.xlsx")print(data.head(3)) #读取前三行数据print(data.tail(3)) #读取后三行数据print(data.describe()) #数据概要统计#使用日期做索引
dates=pd.to_datetime(data['Date'])df=data.set_index(dates)df.drop('Date',1,inplace=True)df['Close'].plot()plt.show() #显示图片
loc——通过行标签索引行数据 iloc——通过行号索引行数据 #访问某列print(df['Close'])#切片,获取指定的行print(df['2018-08-08':'2018-08-18'])#索引切片print(df.loc['2018-08-09',['Open','Close']]) #两个维度切片print(df.loc['2018-08-09','Open']) #查看2018-08-09这个日期的Open值print(df.loc['2018-08-02':'2018-08-06','Close']) #查看2018-08-02到2018-08-06之间的Close值print(df.loc['2018-08-04':'2018-08-08',['Open','Close']]) #查看2018-08-02到2018-08-06之间的Open值和Close值#位置切片print(df.iloc[0,:]) #查看第一条数据print(df.iloc[-5:,:])#获取倒数五条数据print(df.iloc[-20:-10:4]) #步长为4,获取倒数20行到倒数10行的数据print(df.iloc[0,0]) #获取第一条的第一个数据print(df.at[dates[0],'Close']) #获取第一个日期的Close值print(df[df['Open']>60]) #筛选数据,获取Open值大于60的数据df['Fake']=pd.Series(np.random.randn(len(df)),index=dates) #增加一列数据print(df)df2=df.copy() #拷贝一个df2df2[df2<0]=np.nan #小于0的全部设为NANprint(df2)print(df.mean()) #每一列的平均值print(df.mean(1)) #每一行的平均值print(df.groupby(by=df.index.year).mean()) #以年分组,求各年份的平均值print(df.sort_values(by='Open',ascending=False)) #默认升序排序,ascending=False设置降序排列
#批量迭代读取csvdata2=pd.read_csv('test.csv',iterator=True,chunksize=10000,usecols=['date'])print(data2.get_chunk(4)) #获取前四行的数据print(data2) #显示一串字符串 <pandas.io.parsers.TextFileReader object at 0x004CC490>for i in data2: #迭代读取csv的数据 print(i)