前言 使用pandas以及一些概念
前面已经系统的学习使用过mumpy,测试过了matplotlib。python数据分析三剑客numpy,pandas,matplotlib,本篇文章为pandas系列第一章,记述使用pandas过程中的问题。
pandas的一些说明
Pandas处理以下三个数据结构
- 系列(Series) Series 系列关键点:
- 均匀数据
- 尺寸大小
- 不变数据的值可变
- 数据帧(DataFrame) dataframe 关键点:
- 异构数据
- 大小可变
- 数据可变
- 面板(Panel) 面板是具有异构数据的三维数据结构。在图形表示中很难表示面板。但是一个面板可以说明为DataFrame的容器。关键点:
- 异构数据
- 大小可变
- 数据可变
维数和描述考虑这些数据结构的最好方法是,较高维数据结构是其较低维数据结构的容器。 例如,DataFrame是Series的容器,Panel是DataFrame的容器。
数据结构 | 维数 | 描述 |
---|---|---|
系列 | 1 | 1D标记均匀数组,大小不变 |
数据帧 | 2 | 一般2D标记,大小可变的表结构与潜在的异质类型的列。 |
面板 | 3 | 一般3D标记,大小可变数组 |
构建和处理两个或更多个维数组是一项繁琐的任务,用户在编写函数时要考虑数据集的方向。 但是使用Pandas数据结构,减少了用户的思考。
1. 安装
pip3 install pandas复制代码
2. 检测
>>> import pandas as pd>>> pd.__version__'0.24.2'复制代码
- 创建Series对象
>>> s = pd.Series([12,3,4,np.nan,4,7])>>> s0 12.01 3.02 4.03 NaN4 4.05 7.0dtype: float64>>> type(s)复制代码
- 带有日期时间标签的DataFrame对象
>>> dates = pd.date_range('20130101', periods=6)>>> datesDatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04', '2013-01-05', '2013-01-06'], dtype='datetime64[ns]', freq='D')dt = pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('abcd'))>>> dt a b c d2013-01-01 3.037169 -0.858770 0.146364 -0.0959422013-01-02 0.537527 0.726589 -0.096588 -0.2106702013-01-03 0.797981 1.234482 -0.742337 -0.8841752013-01-04 0.354584 -0.321732 -0.692533 -1.0581252013-01-05 -1.010910 2.169853 -0.681772 -0.2378492013-01-06 -0.016872 -0.532582 -1.274204 -1.907988复制代码
- 通过传递可以转换为类似系列的对象的字典来创建DataFrame。使用这个dict对象变为数组:
df2 = pd.DataFrame({ 'A' : 1., 'B' : pd.Timestamp('20170102'), 'C' : pd.Series(1,index=list(range(4)),dtype='float32'), 'D' : np.array([3] * 4,dtype='int32'), 'E' : pd.Categorical(["test","train","test","train"]), 'F' : 'foo' })# 头print(df2.head())# 尾数据print(df2.tail(3))# 索引print(df2.index)# 列明print(df2.columns)# 元素数据print(df2.values)# 数组描述print(df2.describe())# 转置print(df2.T)# 排序,按照索引print(df2.sort_index(axis=1,ascending=False))# 排序,按照值排序 print(df2.sort_values(by='B'))# 获取区块,索引一部分数据,按照列索引数据,分片获取位置复制代码
- 可以看到不同的数据类型:
>>> dt.dtypes1 int642 float643 float644 objectdtype: object复制代码
- 选择和赋值标准的python、numpy表达式非常直观,并且便于交互工作.但是生产环境,我们推荐使用优化的pandas访问数据方法 .at .iat .loc .iloc等方法参考数据文档索引,选择数据,多索引,高级索引
# 使用下面的方式相当于生成一个seriesprint(df2['A'])# 使用索引切片,[0:3]# 打印2行数据print(df2[0:2])# 指定日期dates = pd.date_range('20170101', periods=6)df2 = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))# 使用索引字段,分片索引数据print(df2['20170102':'20170103'])# 通过标签获取一整行的数据df.loc[dates[0]]# 通过标签选择多个轴上的数据df.loc[:,['A','B']]# 通过标签同时在两个轴上切片df.loc['20170101':'20170103',['A','B']]# 减少返回的对象大小df.loc['20170101',['A','B']]# 获取标量值df.loc[dates[0],'A']# 快速访问atdf.at[dates[0],'A']# 按照位置选择 ilocdf.iloc[3]# 通过整数切片df.iloc[3:5,0:2]# 通过整数位置获取分片参数df.iloc[[1,2,4],[0,2]]# 整行的切片df.iloc[1:3,:]# 整列切片df.iloc[:,1:3]# 获取具体位置df.iloc[1,1]# 布尔值索引df[df.A >0]复制代码