pandas入门

作者: Shinichi新一君 | 来源:发表于2017-04-15 08:21 被阅读187次

    功能包括但不限于:

    1.按轴自动或显式数据对齐功能的数据结构
    2.集成时间序列功能
    3.数学运算和约简
    4.灵活处理缺失数据
    5.常见数据库的关系型运算

    引入约定:

    In [1]: from pandas import Series, DataFrame
    In [2]: import pandas as pd

    pandas的数据结构介绍

    Series和DataFrame

    Series

    obj=Series([4,7,-5,3])
    obj

    0    4
    1    7
    2    5
    3  -4
    dtype: int64

    左边是索引,右边是值,分别由obj.index和obj.values获取

    obj2 = Series([4,7,5,-4],index=['d','a','c','b']) #这里我们自定义索引值

    可以通过索引的方式选取\添加和改变Series中的单个或一组值,用法跟字典类似

    NumPy的数组运算(如根据布尔型数组进行过滤\标量乘法\应用数学函数等)都会保留索引和值之间的链接关系
    obj2[obj>0]
    obj2 * 2
    np.exp(obj2)

    可以将Series看成是一个定长的有序字典
    'b' in obj2
    True

    如果数据存放在python字典中,也可以直接通过这个字典来创建Series
    obj3 = Series(dic) 索引就是键
    若存在另外一个列表list
    obj4 = Series(dic, index=list) 如果list中的「索引」没有对应的值,会显示NaN
    pandas的isnull和notnull函数可用于检测缺失数据

    Series的一个重要功能:它在算术运算中会自动对齐不同索引的数据:
    注意与NaN的算术运算总会返回NaN

    Series对象及其索引都有一个name属性,该属性跟pandas其他关键功能关系非常密切
    obj.name = 'abc'
    obj.index,name = 'def'

    Series的索引可以通过赋值的方式就地修改(不能多也不能少)
    obj.index=list

    DataFrame

    一个表格型的数据结构,有行索引列索引,可以看做是由Series组成的字典(共用同一个索引)

    最常用的构建DataFrame方法:直接传入一个由等长列表NumPy数组组成的字典

    data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
    'year': [2000, 2001, 2002, 2001, 2002],
    'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}

    frame = DataFrame(data)

    frame
         pop  state  year
    0  1.5    Ohio  2000
    1  1.7    Ohio  2001
    2  3.6    Ohio  2002
    3  2.4  Nevada  2001
    4  2.9  Nevada  2002

    可以用columnsindex指定列索引和行索引,若传入的列在数据中找不到,就会产生NaN值,行不能多或少否则报错

    通过类似字典标记的方式,可以获取将DataFrame的列获取为一个Series
    frame2['year']
    注意返回的Series拥有相同索引,且name属性也已被相应设置好

    行可以通过索引字段ix获取
    frame2.ix['two']

    列可以通过赋值的方式进行修改;
    将列表或数组赋值给某个列时,长度必须与DataFrame长度匹配;
    如赋值的是一个Series,就会精确匹配到DataFrame的索引,空位将天上缺失值(注意这个Series需要加索引值)
    为不存在的列赋值会创建一个新列;
    关键字del用于删除列
    del frame2['year'] 必须是中括号不能是frame2.year

    通过索引方式返回的是相应数据的视图不是副本,因此对返回Series所做的修改会反映到源DataFrame上;通过Series的copy方法可显式的复制列

    另一种常见的数据形式是嵌套字典
    pop={'Nevada':{2001:2.4,2002:2.9},'Ohio':{2000:1.5,2001:1.7,2002:3.6}}
    frame3 = DataFrame(pop)
    外层字典的键作为列\内层键作为索引
    内层键会被合并\排序形成最终的索引,可以指定索引
    frame3 = DataFrame(pop, index = [2001, 2002, 2003])

    表5-1列出了DataFrame所能接受的各种数据

    可以给DataFrame的index和columns设置name属性,这些信息就会显示出来

    values属性会以二位ndarray的形式返回DataFrame中的数据

    索引对象

    pandas的索引对象负责管理轴标签和其他元数据(比如轴名称)

    Index对象不可修改(immutable),这样才能使Index对象在多个数据结构之间安全共享

    表5-2 pandas中主要的Index对象

    表5-3 Index的方法和属性

    基本功能

    介绍操作Series和DataFrame的基本手段

    重新索引

    reindex\作用是创建一个适应新索引的新对象
    obj=Series([4.5,7.2,-5.3,3.6],index=['d','b','a','c'])
    obj2 = obj.reindex(['a', 'b', 'c', 'd', 'e'], fill_value=0) 这里如果不填写就会引入NaN

    reindex的(插值)method选项
    ffill或pad\前向填充或搬运值
    bfill或backfill\向后填充或搬运值
    obj3.reindex(range(6),method='ffill')
    0      blue
    1      blue
    2    purple
    3    purple
    4    yellow
    5    yellow
    dtype: object

    丢弃指定轴上的项

    drop()相应的columns或index,注意是多个的话用列表形式

    索引\选取和过滤

    Series索引的工作方式类似于NumPy,只不过索引值不只是整数
    obj = Series(np.arange(4.), index=['a', 'b', 'c', 'd'])
    obj
    a 0.0
    b 1.0
    c 2.0
    d 3.0
    obj['b']\1.0
    obj[1]\1.0
    obj[2:4]
    c 2
    d 3
    obj[['b', 'a', 'd']]
    b 1
    a 0
    d 3
    obj[obj < 2]
    a 0
    b 1
    利用标签的切片运算与普通的python切片运算不同,其末端是包含(inclusive)的(封闭区间)
    obj['b':'c']
    b 1
    c 2

    引入字段ix对DataFrame的行上进行标签索引
    data=DataFrame(np.arange(16).reshape((4,4)),index=['Ohio','Colorado','Utah','New York'],columns=['one','two','three','four'])
    data.ix['Colorado', ['two', 'three']]

    表5-6 DataFrame的索引选项

    算术运算和数据对齐

    注意对应关系以及和NaN运算结果始终为NaN

    在算术方法中填充值

    灵活的算术方法
    add(+)
    sub(-)
    div(/)
    mul(*)
    使用类似方法可以传入fill_value参数替代缺失值

    DataFrame和Series之间的运算

    广播(第十二章详解)

    函数应用和映射

    NumPy的ufuncs(元素级数组方法)也可以用于pandas对象

    另一个常见操作是,将函数应用到由各列或行所形成的一维数组上\
    DataFrame的apply方法即可实现此功能
    frame=DataFrame(np.random.randn(4,3),columns=list('bde'),index=['Utah','Ohio','Texas','Oregon'])
    f=lambdax:x.max()-x.min()
    frame.apply(f) #默认是列索引
    frame.apply(f,axis=1) #这个是行索引
    def f(x):
        return Series([x.min(),x.max()],index=['min','max'])
    frame.apply(f)
                  b                   d                e
    min -2.216707 -1.101685 -0.717719
    max  2.266630  1.664559  1.172415

    此外,元素级的python函数也是可用的,假如你想得到frame中各个浮点值的格式化字符串,使用applymap
    format=lambda x:'%.2f' % x
    frame.applymap(format)
                        b      d      e
    Utah    -2.22  1.66  -0.72
    Ohio    0.30  1.21  -0.65
    Texas    2.27  -1.10  1.17
    Oregon  -0.49  0.38  -0.33
    frame['e'].map(format) #对某一列操作函数
    Utah      -0.72
    Ohio      -0.65
    Texas      1.17
    Oregon    -0.33
    Name: e, dtype: object

    排序和排名

    对于Series,使用sort_index方法,返回一个根据index排序的新对象
    obj.order()按值对Series排序
    任何缺失值会被排到末尾

    对于DataFrame,可根据任意轴上的索引进行排序,给sort_index()传入axis=1即可,默认为对index排序
    默认是升序排序,ascending=False为降序排序
    sort_index(by='b') 或 sort_index(by=['b', 'c'])

    排名rank()
    排名时用于破坏平级关系的method选项
    'average'\'min'\'max'\'first'

    带有重复值的轴索引

    若某个索引对应多个值返回Series,对应单个值返回一个标量值

    汇总和计算描述统计

    axis\约简的轴,DataFrame中行用0,列用1(默认为0)
    skipna\排除缺失值,默认是True
    level\如果轴是层次化索引的(即MultiIndex),则根据level分组约简

    describe用于一次性产生多个汇总统计
    df.describe()
    表5-10列出了所有与描述统计相关的方法

    相关系数与协方差

    Series的corr方法用于计算两个Series中重叠的\非NA的\按索引对齐的值的相关系数
    df.series1.corr(df.series2)

    类似的用cov计算协方差

    另外对于一个DataFrame对象的corr和cov方法将返回完整的相关系数或协方差矩阵

    利用DataFrame的corrwith方法,可以计算其列或行跟另一个Series或DataFrame之间的相关系数;

    传入一个Series将会返回一个相关系数值Series(针对各列进行计算)

    传入一个DataFrame则会计算按列名配对的相关系数

    唯一值\值计数以及成员资格

    isin\计算一个表示'Series各值是否包含于传入的值的序列中'的布尔型数组
    unique\计算Series中的唯一值数组,按发现的顺序返回
    value_counts\返回一个Series,其索引为唯一值,其值为频率,按技术支持降序排列

    data=DataFrame({'Qu1':[1,3,4,3,4],'Qu2':[2,3,1,2,3],'Qu3':[1,5,2,4,4]})
    data
      Qu1  Qu2  Qu3
    0    1    2    1
    1    3    3    5
    2    4    1    2
    3    3    2    4
    4    4    3    4
    将pd.value_counts传给该DataFrame的apply函数
    result = data.apply(pd.value_counts).fillna(0)
    result
     Qu1  Qu2  Qu3
    1  1.0  1.0  1.0
    2  0.0  2.0  1.0
    3  2.0  2.0  0.0
    4  2.0  0.0  2.0
    5  0.0  0.0  1.0

    处理缺失数据

    pandas使用浮点值NaN表示浮点和非浮点数组中的缺失数据;
    python内置的None值也会当做NA处理

    dropna\根据各标签的值中是否存在缺失数据对轴标签进行过滤,可通过阈值调节对缺失值的容忍度
    fillna\用指定值或插值方法填充缺失数据

    滤除缺失数据

    对于Series,dropna返回仅含非空数据和索引值的Series;也可以用notnull()布尔索引值方法达到相同结果

    对于DataFrame,默认丢弃任何含有缺失值的行;
    传入how='all',将只丢弃全为NA的行;
    传入axis=1,将丢弃列

    填充缺失数据

    fillna()
    传入常数\传入字典\也可以传入data.mean()平均数,中文数之类的
    fillna默认返回新对象,传入inplace=True会覆盖源对象

    层次化索引

    它能使你在一个轴上拥有多个索引级别\能以低纬度形式处理高维度数据

    重排分级顺序

    swaplevel接受两个级别编号或名称,并返回一个互换级别的新对象(但数据不会发生变化)

    根据级别汇总统计

    level选项用于指定某条轴上求和的级别(利用了groupby功能)

    使用DataFrame的列

    将DataFrame的一个或多个列当做行索引来用,或者可能将行索引变成DataFrame的列.

    set_index()\将列转换为行索引(传入columns的标签),默认会移除这些列,传入drop=False将其保留

    reset_index刚好相反

    其他有关pandas的话题

    整数索引

    面板数据

    Panel数据结构,三维版的DataFrame

    相关文章

      网友评论

        本文标题:pandas入门

        本文链接:https://www.haomeiwen.com/subject/xisgattx.html