美文网首页
【培训】Python常用工具的使用-Pandas

【培训】Python常用工具的使用-Pandas

作者: RoH2A | 来源:发表于2017-10-30 16:37 被阅读0次

    Python Data Analysis Library(Pandas)是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。通过Pandas读取和保存数据,可以大大方便数据的统计与查看。

    一些有用的链接:
    项目地址:http://pandas.pydata.org/
    官方文档:http://pandas.pydata.org/pandas-docs/stable/
    快速入门:10 Minutes to pandas
    翻译版快速入门:十分钟搞定pandas
    Panda速查手册:Pandas速查手册中文版

    安装

    直接通过pip安装:(通过-i参数使用豆瓣的镜像,下载较快)

    pip install pandas -i https://pypi.douban.com/simple/
    

    在数据分析和科学计算领域,有很多包是非常实用的,然而用原生Python安装这些包坑比较多,特别是在Windows环境下。大家可以尝试Python的一个发行包——Anaconda或者Miniconda,已经集成了numpy、scipy等等常用的库。然后就可以使用它们自身的包管理工具conda进行安装:

    conda install pandas
    

    安装完成后,在Python中引入一下,验证是否安装成功,一种常用的引入写法是:

    import pandas as pd
    

    对象创建

    在pandas中,我们常用的有两种对象:Series和Dataframe。可以简单理解为:Series是一维的数组,而Dataframe是二维的表格。

    Series

    Series的创建支持多种方式,常用的方式为通过python的list构建,这种方式下如果不指定index,会自动对每个元素生成int类型的index。

    In [4]: s = pd.Series([1,3,5,np.nan,6,8])
    
    In [5]: s
    Out[5]: 
    0    1.0
    1    3.0
    2    5.0
    3    NaN
    4    6.0
    5    8.0
    dtype: float64
    

    另外一种方式是通过Python的字典进行构建,key值会自动作为index。

    In [6]: sd = {"python":8000, "c++":8100, "c#":4000}
    
    In [7]: s = pd.Series(sd)
    In [8]: s
    Out[8]: 
    c#          4000
    c++         8100
    python      8000
    

    Dataframe

    Dataframe的创建,一般有以下几种方式:

    • 通过Python的字典创建,字典的key值为column的标签,value值为对应column的序列:
    >>> d = {'col1': [1, 2], 'col2': [3, 4]}
    >>> df = pd.DataFrame(data=d)
    >>> df
       col1  col2
    0     1     3
    1     2     4
    
    • 通过字典的字典构建,各内层字典会成为一列,每个字典的键会被合并成结果的index:
    In [227]: nest_dict={'shanghai':{2015:100,2016:101},'beijing':{2015:102,2016:103}}  
      
    In [228]: nest_dict  
    Out[228]: {'beijing': {2015: 102, 2016: 103}, 'shanghai': {2015: 100, 2016: 101}}  
      
    In [229]: df1=DataFrame(nest_dict)  
      
    In [230]: df1  
    Out[230]:   
          beijing  shanghai  
    2015      102       100  
    2016      103       101  
    
    • 通过Series组成的字典创建,每个Series会成为Dataframe的一列,不指定索引的话,每个series的索引会合并(也就是自动对齐)。
    
    In [2]: Shanghai_data = pd.Series({"2015":102,"2016":103})
    
    In [3]: Beijing_data = pd.Series({"2015":105,"2016":106})
    
    In [4]: nest_dict = {"Beijing":Beijing_data, "Shanghai":Shanghai_data}
    
    In [5]: df = pd.DataFrame(nest_dict)
    
    In [6]: df
    Out[6]:
          Beijing  Shanghai
    2015      105       102
    2016      106       103
    
    • 字典或者Series的list,各个项会成为Dataframe的一行。字典键或Series的索引的并集成为Dataframe的列标。
    In [9]: nest_list = [Beijing_data, Shanghai_data]
    
    In [10]: df = pd.DataFrame(nest_list)
    
    In [11]: df = pd.DataFrame(nest_list, index=["Beijing", "Shanghai"])
    
    In [12]: df
    Out[12]:
              2015  2016
    Beijing    105   106
    Shanghai   102   103
    

    数据查看

    pandas提供了非常方便地查看数据的方式,常用的方式有:

    • 查看头尾的数据
    In [33]: finance.head(5)
    Out[33]: 
                      Open        High         Low       Close   Adj Close  \
    Date                                                                     
    2017-10-10  181.649994  184.460007  181.360001  183.119995  183.119995   
    2017-10-11  183.000000  184.699997  182.600998  184.690002  184.690002   
    2017-10-12  184.039993  184.389999  180.348007  180.529999  180.529999   
    2017-10-13  180.960007  181.399994  177.970001  178.449997  178.449997   
    2017-10-16  180.000000  180.050003  178.509995  179.559998  179.559998  
    
    In [34]: finance.tail(5)
    Out[34]: 
                      Open        High         Low       Close   Adj Close  \
    Date                                                                     
    2017-10-31  183.570007  185.119995  181.811005  184.889999  184.889999   
    2017-11-01  187.880005  188.880005  183.580002  186.080002  186.080002   
    2017-11-02  190.990005  191.220001  183.309998  184.809998  184.809998   
    2017-11-03  186.509995  186.929993  182.059998  183.210007  183.210007   
    2017-11-06  184.070007  188.250000  184.000000  187.839996  187.839996   
    
    • 查看索引、列
    
    In [35]: finance.index
    Out[35]: 
    DatetimeIndex(['2017-10-10', '2017-10-11', '2017-10-12', '2017-10-13',
                   '2017-10-16', '2017-10-17', '2017-10-18', '2017-10-19',
                   '2017-10-20', '2017-10-23', '2017-10-24', '2017-10-25',
                   '2017-10-26', '2017-10-27', '2017-10-30', '2017-10-31',
                   '2017-11-01', '2017-11-02', '2017-11-03', '2017-11-06'],
                  dtype='datetime64[ns]', name=u'Date', freq=None)
    
    In [36]: finance.columns
    Out[36]: Index([u'Open', u'High', u'Low', u'Close', u'Adj Close', u'Volume'], dtype='object')
    
    • describe快速统计
    In [38]: finance.describe()
    Out[38]: 
                 Open        High         Low       Close   Adj Close  \
    count   20.000000   20.000000   20.000000   20.000000   20.000000   
    mean   180.204551  181.721499  177.627500  179.423000  179.423000   
    std      5.166460    5.015834    4.803680    5.185056    5.185056   
    min    170.619995  171.449997  168.580002  170.220001  170.220001   
    25%    177.067749  179.142502  174.790001  175.942497  175.942497   
    50%    179.790001  180.759995  177.779998  179.585000  179.585000   
    75%    183.687503  184.804997  181.873253  183.580006  183.580006   
    max    190.990005  191.220001  184.000000  187.839996  187.839996   
    
    • 按值进行排序
    In [41]: finance.sort_values(by=["Open"])
    Out[41]: 
                      Open        High         Low       Close   Adj Close  \
    Date                                                                     
    2017-10-26  170.619995  171.449997  168.580002  170.320007  170.320007   
    2017-10-27  173.190002  177.000000  171.110001  176.149994  176.149994   
    2017-10-24  174.000000  175.979996  173.259995  173.699997  173.699997   
    2017-10-25  174.690002  175.440002  169.300003  170.220001  170.220001   
    2017-10-19  177.001007  179.610001  175.449997  177.929993  177.929993   
    2017-10-18  177.089996  180.000000  176.279999  179.610001  179.610001   
    2017-10-23  177.800003  178.009995  173.050003  173.130005  173.130005   
    2017-10-30  178.429993  181.899994  177.589996  181.580002  181.580002   
    2017-10-20  179.020004  179.520004  177.080002  177.320007  177.320007   
    2017-10-17  179.580002  180.119995  175.300003  175.320007  175.320007   
    2017-10-16  180.000000  180.050003  178.509995  179.559998  179.559998   
    2017-10-13  180.960007  181.399994  177.970001  178.449997  178.449997   
    2017-10-10  181.649994  184.460007  181.360001  183.119995  183.119995   
    2017-10-11  183.000000  184.699997  182.600998  184.690002  184.690002   
    2017-10-31  183.570007  185.119995  181.811005  184.889999  184.889999   
    2017-10-12  184.039993  184.389999  180.348007  180.529999  180.529999   
    2017-11-06  184.070007  188.250000  184.000000  187.839996  187.839996   
    2017-11-03  186.509995  186.929993  182.059998  183.210007  183.210007   
    2017-11-01  187.880005  188.880005  183.580002  186.080002  186.080002   
    2017-11-02  190.990005  191.220001  183.309998  184.809998  184.809998   
    

    数据选择

    1.选择特定列和行的数据
    a['x'] 那么将会返回columns为x的列,注意这种方式一次只能返回一个列。a.x与a['x']意思一样。

    取行数据,通过切片[]来选择
    如:a[0:3] 则会返回前三行的数据。

    2.loc是通过标签来选择数据
    a.loc['one']则会默认表示选取行为'one'的行;

    a.loc[:,['a','b'] ] 表示选取所有的行以及columns为a,b的列;

    a.loc[['one','two'],['a','b']] 表示选取'one'和'two'这两行以及columns为a,b的列;

    a.loc['one','a']与a.loc[['one'],['a']]作用是一样的,不过前者只显示对应的值,而后者会显示对应的行和列标签。

    3.iloc则是直接通过位置来选择数据
    这与通过标签选择类似
    a.iloc[1:2,1:2] 则会显示第一行第一列的数据;(切片后面的值取不到)

    a.iloc[1:2] 即后面表示列的值没有时,默认选取行位置为1的数据;

    a.iloc[[0,2],[1,2]] 即可以自由选取行位置,和列位置对应的数据。

    4.使用条件来选择
    使用单独的列来选择数据
    a[a.c>0] 表示选择c列中大于0的数据

    使用where来选择数据
    a[a>0] 表直接选择a中所有大于0的数据

    使用isin()选出特定列中包含特定值的行
    a1=a.copy()
    a1[a1['one'].isin(['2','3'])] 表显示满足条件:列one中的值包含'2','3'的所有行。

    作者:是蓝先生
    链接:http://www.jianshu.com/p/682c24aef525
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    缺失值处理

    初始化过后,缺失的值会暂时以np.nan代替(Numpy中的空值),可能会妨碍进一步的运算,一般通过fillna()进行处理。
    df.fillna(value=0)

    导入导出文件

    推荐导入导出均使用csv文件,参考:IO Tools
    写入csv文件:
    df.to_csv("foo.csv")
    从csv文件读取:
    pd.read_csv("foo.csv")

    作业

    1. 阅读“十分钟搞定pandas”,了解pandas的一些基础用法
    2. 读取阿里巴巴股票数据,并对该Dataframe进行基本操作的练习(查看数据、选择数据)PS. 需要多安装一个库:pandas-datareader
      读取示例代码:
    In [1]: import pandas 
    In [2]: from pandas_datareader import data
    In [3]: sym = "BABA"
    In [4]: finance = data.DataReader(sym, "yahoo", start="2017/10/11")
    
    1. 从Python S1培训的大作业数据中,选出词频前100的单词,整理成(单词、词频数量、排名前百分之几)的形式,保存为csv格式文件。

    相关文章

      网友评论

          本文标题:【培训】Python常用工具的使用-Pandas

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