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")
作业
- 阅读“十分钟搞定pandas”,了解pandas的一些基础用法
- 读取阿里巴巴股票数据,并对该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")
- 从Python S1培训的大作业数据中,选出词频前100的单词,整理成(单词、词频数量、排名前百分之几)的形式,保存为csv格式文件。