[python][科学计算][pandas]简要使用教程1-数据

2019-03-18  本文已影响0人  jiedawang

最后一次更新日期: 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_levelsset_labelsset_names可以设置整体或是某一级别的索引属性,通过level参数指定级别,默认设置整体;
swaplevel可以交换级别,droplevel可以删除级别,sortlevel可以对指定级别排序;
from_arrayfrom_tuplesfrom_productfrom_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

上一篇下一篇

猜你喜欢

热点阅读