zoukankan      html  css  js  c++  java
  • 十分钟搞定pandas内容

    参考:http://pandas.pydata.org/pandas-docs/stable/whatsnew.html

    https://www.cnblogs.com/chaosimple/p/4153083.html

    十分钟搞定pandas

    #需要导入以下所需要的包
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    

    一、创建对象

    1、可以通过传递一个list对象来创建一个Series, pandas会默认创建整型索引:

    #创建一个序列
    s = pd.Series([1,3,5,np.nan,6,8])
    
    s
    
    0    1.0
    1    3.0
    2    5.0
    3    NaN
    4    6.0
    5    8.0
    dtype: float64
    

    2、通过传递一个numpy array,时间索引以及列标签来创建一个数据帧DataFrame:

    #创建一个时间范围,周期为6
    dates = pd.date_range('20130101',periods=6)
    
    dates
    
    DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
                   '2013-01-05', '2013-01-06'],
                  dtype='datetime64[ns]', freq='D')
    
    #创建一个6行5列的数据帧,行名称为日期,列属性名称为ABCDE,内容由randn函数创建,
    #若不存在 index=dates , 则行名用1,2,3等数字表示;若不存在 columns=list('ABCDE'),则列属性名称也用1,2,3等数字表示
    df = pd.DataFrame(np.random.randn(6,5),index=dates,columns=list('ABCDE'))
    
    df
    
    A B C D E
    2013-01-01 -0.964738 -0.613643 0.111717 -0.355337 -0.395985
    2013-01-02 0.898280 -1.447527 -1.390847 0.344747 -0.476424
    2013-01-03 0.199546 1.277674 -0.634270 0.014981 -0.028560
    2013-01-04 -0.362915 -1.069098 -0.567669 -0.234415 0.585418
    2013-01-05 0.761135 -2.116771 0.745177 0.851333 -0.624389
    2013-01-06 0.052822 -0.689503 -0.401462 1.050330 -1.098080

    3、使用传递的可转换序列的字典对象创建数据帧DataFrame:

    #创建数据帧,每个字典的关键字表示列属性,键值对应列属性的value
    df2 = pd.DataFrame({ 'A' : 1.,
                         'B' : pd.Timestamp('20130102'),
                         'C' : pd.Series(1,index=list(range(5)),dtype='float32'),
                         'D' : np.array([3] * 5,dtype='int32'),
                         'E' : pd.Categorical(["test","train","test","train","sss"]),
                         'F' : 'foo' })
    
    df2
    
    A B C D E F
    0 1.0 2013-01-02 1.0 3 test foo
    1 1.0 2013-01-02 1.0 3 train foo
    2 1.0 2013-01-02 1.0 3 test foo
    3 1.0 2013-01-02 1.0 3 train foo
    4 1.0 2013-01-02 1.0 3 sss foo
    #查看数据帧中各类数据类型,只能用于查看字典形成的数据帧,用randn形成的数据帧不能使用该命令,否则出错
    df2.dtypes
    
    A           float64
    B    datetime64[ns]
    C           float32
    D             int32
    E          category
    F            object
    dtype: object
    
    #df2. <TAB>
    

    如你所见, 列 A, B, C, 和 D 也是自动完成标签. E 也是可用的; 为了简便起见,后面的属性显示被截断.

    二、查看数据

    1、查看帧顶部和底部行

    #df.head(5)表示查看数据帧df的头五行,默认为5,也可看头3行
    df.head()
    
    A B C D E
    2013-01-01 -0.964738 -0.613643 0.111717 -0.355337 -0.395985
    2013-01-02 0.898280 -1.447527 -1.390847 0.344747 -0.476424
    2013-01-03 0.199546 1.277674 -0.634270 0.014981 -0.028560
    2013-01-04 -0.362915 -1.069098 -0.567669 -0.234415 0.585418
    2013-01-05 0.761135 -2.116771 0.745177 0.851333 -0.624389
    #df.tail(3)表示查看数据帧df的尾3行,默认为5
    df.tail(3)
    
    A B C D E
    2013-01-04 -0.362915 -1.069098 -0.567669 -0.234415 0.585418
    2013-01-05 0.761135 -2.116771 0.745177 0.851333 -0.624389
    2013-01-06 0.052822 -0.689503 -0.401462 1.050330 -1.098080

    2、显示数据帧的索引,列和底层numpy数据

    #取出数据帧df的索引项,即行名称
    df.index
    
    DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
                   '2013-01-05', '2013-01-06'],
                  dtype='datetime64[ns]', freq='D')
    
    #取出数据帧df的属性列名称
    df.columns
    
    Index(['A', 'B', 'C', 'D', 'E'], dtype='object')
    
    #取出数据帧df中的内容,这一点很重要,能够将数据帧的行索引项名称和列属性项名称去掉
    df.values
    
    array([[-0.96473798, -0.61364267,  0.11171683, -0.35533705, -0.39598527],
           [ 0.8982796 , -1.44752742, -1.39084675,  0.3447475 , -0.47642425],
           [ 0.19954556,  1.27767394, -0.63427023,  0.01498146, -0.0285603 ],
           [-0.36291476, -1.06909798, -0.56766898, -0.23441501,  0.58541824],
           [ 0.7611348 , -2.11677119,  0.74517694,  0.85133303, -0.62438946],
           [ 0.05282224, -0.68950339, -0.4014616 ,  1.05032997, -1.09808038]])
    

    3、描述显示数据快速统计摘要

    #描述数据帧df中的内容的一些统计项,包括数目、均值、标准差、最小最大值及其中间值
    df.describe()
    type(df)
    
    pandas.core.frame.DataFrame
    

    4、转置数据

    #将行列进行转化,包括索引项、列属性项以及其中的内容
    df.T
    
    2013-01-01 00:00:00 2013-01-02 00:00:00 2013-01-03 00:00:00 2013-01-04 00:00:00 2013-01-05 00:00:00 2013-01-06 00:00:00
    A -0.964738 0.898280 0.199546 -0.362915 0.761135 0.052822
    B -0.613643 -1.447527 1.277674 -1.069098 -2.116771 -0.689503
    C 0.111717 -1.390847 -0.634270 -0.567669 0.745177 -0.401462
    D -0.355337 0.344747 0.014981 -0.234415 0.851333 1.050330
    E -0.395985 -0.476424 -0.028560 0.585418 -0.624389 -1.098080

    5、按轴排序

    #若axis=1,则行索引项不变,列属性项进行竖轴转换,内容不改变;若axis=0,则列属性项不变,行索引项进行横轴转换,内容不改变;默认为axis=0,即横轴转换
    # ascending=Flase 必须存在,否则数据帧不作任何改变
    df.sort_index(axis=1, ascending=False)
    
    E D C B A
    2013-01-01 -0.395985 -0.355337 0.111717 -0.613643 -0.964738
    2013-01-02 -0.476424 0.344747 -1.390847 -1.447527 0.898280
    2013-01-03 -0.028560 0.014981 -0.634270 1.277674 0.199546
    2013-01-04 0.585418 -0.234415 -0.567669 -1.069098 -0.362915
    2013-01-05 -0.624389 0.851333 0.745177 -2.116771 0.761135
    2013-01-06 -1.098080 1.050330 -0.401462 -0.689503 0.052822

    6、按值排序

    #df.sort_values(columns='B')
    df.sort_values(by='B')   #一开始是columns指定列排序,现在改为了by进行排序
    
    A B C D E
    2013-01-05 0.761135 -2.116771 0.745177 0.851333 -0.624389
    2013-01-02 0.898280 -1.447527 -1.390847 0.344747 -0.476424
    2013-01-04 -0.362915 -1.069098 -0.567669 -0.234415 0.585418
    2013-01-06 0.052822 -0.689503 -0.401462 1.050330 -1.098080
    2013-01-01 -0.964738 -0.613643 0.111717 -0.355337 -0.395985
    2013-01-03 0.199546 1.277674 -0.634270 0.014981 -0.028560

    三、选择器

    注释: 标准Python / Numpy表达式可以完成这些互动工作, 但在生产代码中, 我们推荐使用优化的pandas数据访问方法, .at, .iat, .loc, .iloc 和 .ix.

    1、读取

    (1)选择单列,这会产生一个序列,等价与df.A

    df['A']
    
    2013-01-01   -0.964738
    2013-01-02    0.898280
    2013-01-03    0.199546
    2013-01-04   -0.362915
    2013-01-05    0.761135
    2013-01-06    0.052822
    Freq: D, Name: A, dtype: float64
    

    (2)使用 [] 选择行切片,若想进行列切片,可以先将数据帧进行转置,然后切片,最后转换回来

    #只能进行行切片,不能做列切片;
    df[0:3]
    
    A B C D E
    2013-01-01 -0.964738 -0.613643 0.111717 -0.355337 -0.395985
    2013-01-02 0.898280 -1.447527 -1.390847 0.344747 -0.476424
    2013-01-03 0.199546 1.277674 -0.634270 0.014981 -0.028560
    df['20130102':'20130104']
    
    A B C D E
    2013-01-02 0.898280 -1.447527 -1.390847 0.344747 -0.476424
    2013-01-03 0.199546 1.277674 -0.634270 0.014981 -0.028560
    2013-01-04 -0.362915 -1.069098 -0.567669 -0.234415 0.585418

    2、使用标签选择

    更多标签选择

    (1)使用标签获取横截面

    #获取数据帧的某一行,此处若写成 df.loc[dates[0]], 则出现错误
    df.loc[dates[0]]
    
    A   -0.964738
    B   -0.613643
    C    0.111717
    D   -0.355337
    E   -0.395985
    Name: 2013-01-01 00:00:00, dtype: float64
    

    (2)使用标签选择多轴

    #取出两个列属性的所有行
    df.loc[:,['A','B']]
    
    A B
    2013-01-01 -0.964738 -0.613643
    2013-01-02 0.898280 -1.447527
    2013-01-03 0.199546 1.277674
    2013-01-04 -0.362915 -1.069098
    2013-01-05 0.761135 -2.116771
    2013-01-06 0.052822 -0.689503

    (3)显示标签切片,包含两个端点

    #取出数据帧中的3行2列
    df.loc['20130102':'20130104',['A','B']]
    
    A B
    2013-01-02 0.898280 -1.447527
    2013-01-03 0.199546 1.277674
    2013-01-04 -0.362915 -1.069098

    (4)降低返回对象维度

    #通过选取某一行,提取出该行的列属性值,从而达到降低维度的作用
    df.loc['20130102',['A','B']]
    
    A    0.898280
    B   -1.447527
    Name: 2013-01-02 00:00:00, dtype: float64
    
    #取出数据帧的行列名称---标签,取其中的内容
    df.loc['20130102',['A','B']].values
    
    array([ 0.8982796 , -1.44752742])
    

    (5)获取标量值

    #获取某一行某一列的值,行列用对应标签取出
    df.loc[dates[0],'A']
    
    -0.9647379819614053
    

    (6)快速访问并获取标量数据(同上面的方法一样)

    df.at[dates[0],'A']
    
    -0.9647379819614053
    

    3、按位置选择 —— 对应按标签选择

    (1)传递整数选择位置

    #这里只需要指明第3行,即可取出;对应前面的df.loc[date[0]],需要指明行的属性的第0行
    df.iloc[3]
    
    A   -0.362915
    B   -1.069098
    C   -0.567669
    D   -0.234415
    E    0.585418
    Name: 2013-01-04 00:00:00, dtype: float64
    

    (2)使用整数片段,效果类似 numpy / python

    df.iloc[3:5,0:2]
    
    A B
    2013-01-04 -0.362915 -1.069098
    2013-01-05 0.761135 -2.116771

    (3)使用整数偏移定位列表,效果类似于 numpy / python 样式

    超级重要,正好解决燃眉之急

    #直接就可以取出自己想要取出的某一行某一列,相当有用
    df.iloc[[1,2,4],[0,2]]
    
    A C
    2013-01-02 0.898280 -1.390847
    2013-01-03 0.199546 -0.634270
    2013-01-05 0.761135 0.745177

    (4)显示行切片——爆裂所有列

    df.iloc[1:3,:]
    
    A B C D E
    2013-01-02 0.898280 -1.447527 -1.390847 0.344747 -0.476424
    2013-01-03 0.199546 1.277674 -0.634270 0.014981 -0.028560

    (5)显示列切片——保留所有行

    df.iloc[:,1:3]
    
    B C
    2013-01-01 -0.613643 0.111717
    2013-01-02 -1.447527 -1.390847
    2013-01-03 1.277674 -0.634270
    2013-01-04 -1.069098 -0.567669
    2013-01-05 -2.116771 0.745177
    2013-01-06 -0.689503 -0.401462

    (6)显示获取一个值

    #取出第一行第一列的数值
    df.iloc[1,1]
    
    -1.4475274167250514
    

    (7)快速访问一个标量——等同上个方法

    df.iat[1,1]
    
    -1.4475274167250514
    

    十二、导入和保存数据

    导入csv文件时,添加列名的方式为:

    x0=pd.read_csv(input_file, header=None, names=Feature)

    若数据以tab分隔,则读取时可以去除的方式,如下:

    df = pd.read.csv('../input/data_train.csv', sep=' ', encoding='GBK')

    可以用sep参数进行去除;

  • 相关阅读:
    【还是畅通工程 HDU
    【畅通工程 HDU
    【hdu 2544最短路】【Dijkstra算法模板题】
    【Isabella Message】 【SPOJ
    【统计难题】【HDU
    【I'm Telling the Truth】【HDU
    Arranging Your Team HDU
    JavaScript和jQuery改变标签内容
    JavaScript获取地址栏内容
    JavaScript遍历IP段内所有IP
  • 原文地址:https://www.cnblogs.com/hugechuanqi/p/9839638.html
Copyright © 2011-2022 走看看