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

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)