[python][科学计算][pandas]简要使用教程1-数据
最后一次更新日期: 2019/3/21
pandas
是基于numpy
的数据分析库,提供一些更易用的数据模型和大量高效的统计方法。
使用前先导入模块:
import pandas as pd
按需导入以下模块:
import numpy as np
import matplotlib.pyplot as plt
1. 索引Index
numpy中只有位置索引,而pandas还增加了标签索引,依赖于一个专用的Index
类型。
常规索引
In [64]: pd.Index([1,2,3])
Out[64]: Int64Index([1, 2, 3], dtype='int64')
In [65]: pd.Index([1.,2.,3.])
Out[65]: Float64Index([1.0, 2.0, 3.0], dtype='float64')
In [66]: pd.Index(['a','b','c'])
Out[66]: Index(['a', 'b', 'c'], dtype='object')
In [67]: pd.Index(range(10))
Out[67]: RangeIndex(start=0, stop=10, step=1)
In [68]: pd.Index(range(10)).values
Out[68]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int64)
In [80]: import datetime as dt
...: dt1=dt.datetime.now()
...: dt2=dt1+dt.timedelta(days=1)
In [81]: pd.Index([dt1,dt2])
Out[81]: DatetimeIndex(['2019-03-09 20:56:14.644159', '2019-03-10 20:56:14.644159'], dtype='datetime64[ns]', freq=None)
Index
在创建时会根据传入数据(一维序列)自动生成具体的索引类型,也可通过dtype
参数指定类型,但无法正常转换时会报错;copy
参数指定创建索引时是否复制源数据,默认false
。
具体的索引类型也可通过各自的方法创建。
Index.values
可以查看作为数据基础的一维数组,Index.dtype
可以查看数据类型。
多级索引
pandas提供了多级索引以便于分组数据,可用于构造高维数据集,groupby
计算也会自动产生多级索引。
In [5]: midx=pd.MultiIndex(levels=[['a','b'],['c','d']],labels=[[1,1,0,0],[0,1,0,1]],name=['idx1','idx2'])
In [6]: midx
Out[6]:
MultiIndex(levels=[['a', 'b'], ['c', 'd']],
labels=[[1, 1, 0, 0], [0, 1, 0, 1]],
names=['idx1', 'idx2'])
In [9]: midx.set_labels([1,0,1,0],level=1)
Out[9]:
MultiIndex(levels=[['a', 'b'], ['c', 'd']],
labels=[[1, 1, 0, 0], [1, 0, 1, 0]],
names=['idx1', 'idx2'])
In [11]: midx.swaplevel(0,1)
Out[11]:
MultiIndex(levels=[['c', 'd'], ['a', 'b']],
labels=[[0, 1, 0, 1], [1, 1, 0, 0]],
names=['idx2', 'idx1'])
In [12]: pd.MultiIndex.from_arrays([['a','a','b','b'],['c','d','c','d']],names=['idx1','idx2'])
Out[12]:
MultiIndex(levels=[['a', 'b'], ['c', 'd']],
labels=[[0, 0, 1, 1], [0, 1, 0, 1]],
names=['idx1', 'idx2'])
MultiIndex
的第一个参数levels
是每个级别的唯一标签列表,是一个两层嵌套的序列,外层对应级别,内层对应唯一标签;
第二个参数labels
是所有记录在每个级别上选取的标签序号,也是一个两层嵌套的序列,外层对应级别,内层对应记录,新版本中已被codes
参数取代;
第四个参数names
是每个级别的名称。
MultiIndex
提供了一些辅助方法,set_levels
、set_labels
、set_names
可以设置整体或是某一级别的索引属性,通过level
参数指定级别,默认设置整体;
swaplevel
可以交换级别,droplevel
可以删除级别,sortlevel
可以对指定级别排序;
from_array
、from_tuples
、from_product
、from_frame
方法可从其他结构的数据中创建索引。
2. 数据序列Series
In [99]: s=pd.Series([1,2,3,4],name='s1')
In [100]: s
Out[100]:
0 1
1 2
2 3
3 4
Name: s1, dtype: int64
In [101]: pd.Series([[1,2],[3,4]],index=['row1','row2'])
Out[101]:
row1 [1, 2]
row2 [3, 4]
dtype: object
In [102]: s.dtype
Out[102]: dtype('int64')
In [103]: s.name
Out[103]: 's1'
In [104]: s.values
Out[104]: array([1, 2, 3, 4], dtype=int64)
In [105]: s.index
Out[105]: RangeIndex(start=0, stop=4, step=1)
In [106]: s.shape
Out[106]: (4,)
核心数据模型其一,由序列名name
、标签索引index
、值数组(一维)values
组成。用于存放一维数据,只有一个轴方向:0,shape
属性可以查看数据集的形状。
创建时只能接收一维序列数据(list,tuple,ndarray),超过一维的将后面的维度看作元素的维度,会根据传入的数据自动判断类型,也可通过dtype
参数显示指定。
默认情况下会生成范围索引,可通过index
参数指定一个一维序列作为索引,也可在创建后直接为index
属性赋值。
3. 数据框DataFrame
In [107]: df=pd.DataFrame([[1,'a'],[2,'b']],columns=['col1','col2'])
In [108]: df
Out[108]:
col1 col2
0 1 a
1 2 b
In [113]: df.dtypes
Out[113]:
col1 int64
col2 object
dtype: object
In [114]: df.index
Out[114]: Int64Index([1, 2], dtype='int64', name='col1')
In [116]: df.columns
Out[116]: Index(['col1', 'col2'], dtype='object')
In [117]: df.values
Out[117]:
array([[1, 'a'],
[2, 'b']], dtype=object)
In [125]: df.col2
Out[125]:
col1
1 a
2 b
Name: col2, dtype: object
In [126]: pd.DataFrame({'col1':[1,3],'col2':['a','b']})
Out[126]:
col1 col2
0 1 a
1 3 b
In [127]: df.shape
Out[127]: (2, 2)
核心数据模型其二,也就是数据表,由列标签索引columns
、行标签索引index
、值数组(二维)values
组成。用于存放二维数据,有两个轴方向:0和1,对应行坐标和列坐标,shape
属性可以查看数据集的形状。列数据的访问可以通过与列名相同的属性名访问,仅在定义了字符串列名时可用,一个单列即是一个Series
。
创建时只能接收二维序列数据(list,tuple,ndarray),超过二维的将后面的维度看作元素的维度,会根据传入的数据自动判断类型,也可通过dtype
参数显示指定,与numpy不太一样的是,DataFrame
的列可以定义不同的数据类型,通过创建时的自动判断,或是筛选出列后转换类型,DataFrame.dtypes
属性可查看所有列的数据类型。相比numpy,pandas的DataFrame
创建还增加了对dict
数据源的支持,key
对应列名,value
对应列数据。
默认情况下会生成范围索引,可通过index
参数指定一个一维序列作为索引,也可在创建后直接为index
属性赋值,DataFrame.set_index
方法可以返回替换了索引的数据框副本而不影响原数据。
DataFrame
相当于Series
的堆叠,沿DataFrame
的行或列方向进行宽度为1的切片,得到的就是一个Series
。
原本pandas还提供了三维的数据模型Panel
,但新版中已经废弃,可尝试使用多级索引MultiIndex
来构造更高维度的数据集。
4. 分类数据Categorical
pandas提供了分类数据类型用于约束此类数据,该类型会限制分类标签的取值,并可为分类标签提供排序依据。
In[14]: pd.Categorical(['a','b','b','c'],categories=['a','b'],ordered=True)
Out[14]:
[a, b, b, NaN]
Categories (2, object): [a < b]
In[15]: pd.Categorical(['a','b','b','c'])
Out[15]:
[a, b, b, c]
Categories (3, object): [a, b, c]
第一个参数values
为所有分类标签的序列;
第二个参数categories
为唯一分类标签的序列,当指定该参数后,values
中不属于categories
的标签会被替换为NaN
,不指定时会根据values
自动生成;
第三个参数ordered
声明唯一分类标签是否指示排序方式,为True
时会按categories
中的顺序对标签标定大小关系,默认False
。