pandas笔记

Posted BabyGo000

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pandas笔记相关的知识,希望对你有一定的参考价值。

Pandas类似R语言中的数据框(DataFrame),Pandas基于Numpy,但是对于数据框结构的处理比Numpy要来的容易。

1. Pandas的基本数据结构和使用

Pandas有两个主要的数据结构:Series和DataFrame。Series类似Numpy中的一维数组,DataFrame则是使用较多的多维表格数据结构。

Series的创建


   >>>import numpy as np
   >>>import pandas as pd
   >>>s=pd.Series([1,2,3,np.nan,44,1]) # np.nan创建一个缺失数值
   >>>s # 若未指定,Series会自动建立index,此处自动建立索引0-5
   0   1.0
   1   2.0
   2   3.0
   3   NaN
   4  44.0
   5   1.0
   dtype: float64

DataFrame的创建


   >>>dates=pd.date_range(\'20170101\',periods=6)
   >>>dates
   DatetimeIndex([\'2017-01-01\', \'2017-01-02\', \'2017-01-03\', \'2017-01-04\',
           \'2017-01-05\', \'2017-01-06\'],
          dtype=\'datetime64[ns]\', freq=\'D\')
   >>>df=pd.DataFrame(np.random.randn(6,4),index=dates,columns=[\'a\',\'b\',\'c\',\'d\'])
   >>>df
              a     b     c     d
   2017-01-01 -1.993447 1.272175 -1.578337 -1.972526
   2017-01-02 0.092701 -0.503654 -0.540655 -0.126386
   2017-01-03 0.191769 -0.578872 -1.693449 0.457891
   2017-01-04 2.121120 0.521884 -0.419368 -1.916585
   2017-01-05 1.642063 0.222134 0.108531 -1.858906
   2017-01-06 0.636639 0.487491 0.617841 -1.597920

DataFrame可以跟Numpy一样根据索引取出其中的数据,只是DataFrame索引方式更加多样化。DataFrame不仅可以根据默认的行列编号来索引,还可以根据标签序列来索引。

还可以采用字典的方式创建DataFrame:


   >>>df2=pd.DataFrame({\'a\':1,\'b\':\'hello kitty\',\'c\':np.arange(2),\'d\':[\'o\',\'k\']})
   >>>df2
      a      b c d
   0 1 hello kitty 0 o
   1 1 hello kitty 1 k

对于DataFrame的一些属性也可以采用相应的方法查看


   dtype # 查看数据类型
   index # 查看行序列或者索引
   columns # 查看各列的标签
   values # 查看数据框内的数据,也即不含表头索引的数据
   describe # 查看数据的一些信息,如每一列的极值,均值,中位数之类的,只能对数值型数据统计信息
   transpose # 转置,也可用T来操作
   sort_index # 排序,可按行或列index排序输出
   sort_values # 按数据值来排序

一些例子


   >>>df2.dtypes
   a   int64
   b  object
   c   int64
   d  object
   dtype: object
   >>>df2.index
   RangeIndex(start=0, stop=2, step=1)
   >>>df2.columns
   Index([\'a\', \'b\', \'c\', \'d\'], dtype=\'object\')
   >>>df2.values
   array([[1, \'hello kitty\', 0, \'o\'],
      [1, \'hello kitty\', 1, \'k\']], dtype=object)
   >>>df2.describe # 只能对数值型数据统计信息
        a     c
   count 2.0 2.000000
   mean  1.0 0.500000
   std  0.0 0.707107
   min  1.0 0.000000
   25%  1.0 0.250000
   50%  1.0 0.500000
   75%  1.0 0.750000
   max  1.0 1.000000
   >>>df2.T
          0      1
   a      1      1
   b hello kitty hello kitty
   c      0      1
   d      o      k
   >>>df2.sort_index(axis=1,ascending=False) # axis=1 按列标签从大到小排列
      d c      b a
   0 o 0 hello kitty 1
   1 k 1 hello kitty 1
   >>>df2.sort_index(axis=0,ascending=False) # 按行标签从大到小排序
      a      b c d
   1 1 hello kitty 1 k
   0 1 hello kitty 0 o
   >>>df2.sort_values(by="c",ascending=False) # 按c列的值从大到小排序
     a      b c d
   1 1 hello kitty 1 k
   0 1 hello kitty 0 o

2. 从DataFrame中筛选取出目的数据

从DataFrame中取出目的数据方法有多种,一般常用的有:

    • 直接根据索引选取

    • 根据标签选取(纵向选择列):loc

    • 根据序列(横向选择行): iloc

    • 组合使用标签序列来选取特定位置的数据: ix

    • 通过逻辑判断筛选

简单选取


   >>>import numpy as np
   >>>import pandas as pd
   >>>dates=pd.date_range(\'20170101\',periods=6)
   >>>df=pd.DataFrame(np.arange(24).reshape((6,4)),index=dates,columns=[\'a\',\'b\',\'c\',\'d\'])
   >>>df
           a  b  c  d
   2017-01-01  0  1  2  3
   2017-01-02  4  5  6  7
   2017-01-03  8  9 10 11
   2017-01-04 12 13 14 15
   2017-01-05 16 17 18 19
   2017-01-06 20 21 22 23
   >>>df[\'a\']     # 根据表签直接选取a列,也可用df.a,结果相同
   2017-01-01   0
   2017-01-02   4
   2017-01-03   8
   2017-01-04  12
   2017-01-05  16
   2017-01-06  20
   Freq: D, Name: a, dtype: int64
   >>>df[0:3]  # 选择前3行,也可用行标签 df[\'2017-01-01\':\'2017-01-03\'],结果相同,但是无法用此法选择多列
          a b  c  d
   2017-01-01 0 1  2  3
   2017-01-02 4 5  6  7
   2017-01-03 8 9 10 11

loc使用显式的行标签来选取数据

DataFrame行的表示方式有两种,一种是通过显式的行标签来索引,另一种是通过默认隐式的行号来索引。loc方法是通过行标签来索引选取目标行,可以配合列标签来选取特定位置的数据。


   >>>df.loc[\'2017-01-01\':\'2017-01-03\']
          a b  c  d
   2017-01-01 0 1  2  3
   2017-01-02 4 5  6  7
   2017-01-03 8 9 10 11
   >>>df.loc[\'2017-01-01\',[\'a\',\'b\']]  # 选取特定行的a,b列
   a  0
   b  1
   Name: 2017-01-01 00:00:00, dtype: int64

iloc使用隐式的行序列号来选取数据

使用iloc可以搭配列序列号来更简单的选取特定位点的数据


   >>>df.iloc[3,1]
   13
   >>>df.iloc[1:3,2:4]
           c  d
   2017-01-02  6  7
   2017-01-03 10 11

ix利用ix可以混用显式标签与隐式序列号

loc只能使用显式标签来选取数据,而iloc只能使用隐式序列号来选取数据,ix则能将二者结合起来使用。


   >>> df.ix[3:5,[\'a\',\'b\']]
          a  b
   2017-01-04 12 13
   2017-01-05 16 17

使用逻辑判断来选取数据


   >>>df
           a  b  c  d
   2017-01-01  0  1  2  3
   2017-01-02  4  5  6  7
   2017-01-03  8  9 10 11
   2017-01-04 12 13 14 15
   2017-01-05 16 17 18 19
   2017-01-06 20 21 22 23
   >>>df[df[\'a\']>5] # 等价于df[df.a>5]
           a  b  c  d
   2017-01-03  8  9 10 11
   2017-01-04 12 13 14 15
   2017-01-05 16 17 18 19
   2017-01-06 20 21 22 23

3. Pandas设置特定位置值


   >>>import numpy as np
   >>>import pandas as pd
   >>>dates=pd.date_range(\'20170101\',periods=6)
   >>>datas=np.arange(24).reshape((6,4))
   >>>columns=[\'a\',\'b\',\'c\',\'d\']
   >>>df=pd.DataFra me(data=datas,index=dates,colums=columns)
   >>>df.iloc[2,2:4]=111 # 将第2行2,3列位置的数据改为111
           a  b  c  d
   2017-01-01  0  1  2  3
   2017-01-02  4  5  6  7
   2017-01-03  8  9 111 111
   2017-01-04 12 13  14  15
   2017-01-05 16 17  18  19
   2017-01-06 20 21  22  23
   >>>df.b[df[\'a\']>10]=0 # 等价于df.b[df.a>10] # 以a列大于10的数的位置为参考,改变b列相应行的数值为0
           a b  c  d
   2017-01-01  0 1  2  3
   2017-01-02  4 5  6  7
   2017-01-03  8 9 111 111
   2017-01-04 12 0  14  15
   2017-01-05 16 0  18  19
   2017-01-06 20 0  22  23
   >>>df[\'f\']=np.nan  # 新建f列并设置数值为np.nan
          a b  c  d  f
   2017-01-01  0 1  2  3 NaN
   2017-01-02  4 5  6  7 NaN
   2017-01-03  8 9 111 111 NaN
   2017-01-04 12 0  14  15 NaN
   2017-01-05 16 0  18  19 NaN
   2017-01-06 20 0  22  23 NaN
   >>>
   # 用上面的方法也可以加上`Series`序列,但是必须与列长度一致
   >>>df[\'e\']=pd.Series(np.arange(6),index=dates)
   >>>df
          a b  c  d  f e
   2017-01-01  0 1  2  3 NaN 0
   2017-01-02  4 5  6  7 NaN 1
   2017-01-03  8 9 111 111 NaN 2
   2017-01-04 12 0  14  15 NaN 3
   2017-01-05 16 0  18  19 NaN 4
   2017-01-06 20 0  22  23 NaN 5

4. 处理丢失数据

有时候我们的数据中会有一些空的或者缺失(NaN)数据,使用dropna可以选择性的删除或填补这些NaN数据。drop函数可以选择性的删除行或者列,drop_duplicates去除冗余。fillna则将NaN值用其他值替换。操作后不改变原值,若要保存更改需重新赋值。


   >>>import numpy as np
   >>>import pandas as pd
   >>>df=pd.DataFrame(np.arange(24).reshape(6,4),index=pd.date_range(\'20170101\',periods=6),columns=[\'a\',\'b\',\'c\',\'d\'])
   >>>df
          a  b  c  d
   2017-01-01  0  1  2  3
   2017-01-02  4  5  6  7
   2017-01-03  8  9 10 11
   2017-01-04 12 13 14 15
   2017-01-05 16 17 18 19
   2017-01-06 20 21 22 23
   >>>df.iloc[1,3]=np.nan
   >>>di.iloc[3,2]=np.nan
   >>>df.
          a  b   c   d
   2017-01-01  0  1  2.0  3.0
   2017-01-02  4  5  6.0  NaN
   2017-01-03  8  9 10.0 11.0
   2017-01-04 12 13  NaN 15.0
   2017-01-05 16 17 18.0 19.0
   2017-01-06 20 21 22.0 23.0
   >>>df.dropna(axis=0,how=\'any\') # axis=0(1)表示将含有NaN的行(列)删除。
      # how=\'any\'表示只要行(或列,视axis取值而定)含有NaN则将该行(列)删除,
      # how=\'all\'表示当某行(列)全部为NaN时才删除
          a  b   c   d
   2017-01-01  0  1  2.0  3.0
   2017-01-03  8  9 10.0 11.0
   2017-01-05 16 17 18.0 19.0
   2017-01-06 20 21 22.0 23.0
   >>>df.fillna(value=55)
          a  b   c   d
   2017-01-01  0  1  2.0  3.0
   2017以上是关于pandas笔记的主要内容,如果未能解决你的问题,请参考以下文章

pandas GroupBy上的方法apply:一般性的“拆分-应用-合并”

text [检查特定的数据片段]取自论文但有意思应用。 #python #pandas

pandas学习笔记D1

pandas学习笔记D2

[原创]java WEB学习笔记61:Struts2学习之路--通用标签 property,uri,param,set,push,if-else,itertor,sort,date,a标签等(代码片段

Python:用于元组的 Pandas DataFrame