Pandas
是 python 的一个数据分析包,属于PyData项目的一部分。Pandas最初被作为金融数据分析工具而开发出来,因此 pandas 为时间序列分析提供了很好的支持。 Pandas 的名称来自于面板数据(panel data)和python数据分析 (data analysis)
。panel data是经济学中关于多维数据集的一个术语,在Pandas中也提供了panel的数据类型。
在我看来,对于 Numpy
以及 Matplotlib
, Pandas
可以帮助创建一个非常牢固的用于数据挖掘与分析的基础。而 Scipy
当然是另一个主要的也十分出色的科学计算库。
通过pip进行安装: pip install pandas
导入:
import pandas as pd
Pandas基于两种数据类型: series
与 dataframe
。
一个series是一个一维的数据类型,其中每一个元素都有一个标签。类似于Numpy中元素带标签的数组。其中,标签可以是数字或者字符串。
# coding: utf-8 import numpy as np import pandas as pd s = pd.Series([1, 2, 5, np.nan, 6, 8]) print s
输出:
0 1.0 1 2.0 2 5.0 3 NaN 4 6.0 5 8.0 dtype: float64
一个dataframe是一个二维的表结构。Pandas的dataframe可以存储许多种不同的数据类型,并且每一个坐标轴都有自己的标签。你可以把它想象成一个series的字典项。
#创建日期索引序列 dates = pd.date_range('20130101', periods=6) #创建Dataframe,其中 index 决定索引序列,columns 决定列名 df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD')) print df
输出:
A B C D 2013-01-01 -0.334482 0.746019 -2.205026 -0.803878 2013-01-02 2.007879 1.559073 -0.527997 0.950946 2013-01-03 -1.053796 0.438214 -0.027664 0.018537 2013-01-04 -0.208744 -0.725155 -0.395226 -0.268529 2013-01-05 0.080822 -1.215433 -0.785030 0.977654 2013-01-06 -0.126459 0.426328 -0.474553 -1.968056
df2 = pd.DataFrame({ 'A' : 1., 'B' : pd.Timestamp('20130102'), 'C' : pd.Series(1,index=list(range(4)),dtype='float32'), 'D' : np.array([3] * 4,dtype='int32'), 'E' : pd.Categorical(["test","train","test","train"]), 'F' : 'foo' })
输出:
A B C D E F 0 1 2013-01-02 1 3 test foo 1 1 2013-01-02 1 3 train foo 2 1 2013-01-02 1 3 test foo 3 1 2013-01-02 1 3 train foo
df = pd.read_csv("Average_Daily_Traffic_Counts.csv", header = 0) df.head()
数据源可以是 英国政府数据
或 美国政府数据
来获取数据源。当然, Kaggle
是另一个好用的数据源。
# 选择单独的一列,返回 Serires,与 df.A 效果相当。 df['A'] # 位置切片 df[0:3] # 索引切片 df['20130102':'20130104'] # 通过标签选择 df.loc[dates[0]] # 对多个轴同时通过标签进行选择 df.loc[:,['A','B']] # 获得某一个单元的数据 df.loc[dates[0],'A'] # 或者 df.at[dates[0],'A'] # 速度更快的做法 # 通过位置进行选择 df.iloc[3] # 切片 df.iloc[3:5,0:2] # 列表选择 df.iloc[[1,2,4],[0,2]] # 获得某一个单元的数据 df.iloc[1,1] # 或者 df.iat[1,1] # 更快的做法 # 布尔索引 df[df.A > 0] # 获得大于零的项的数值 df[df > 0] # isin 过滤 df2[df2['E'].isin(['two','four'])]
# 新增一列,根据索引排列 s1 = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130102', periods=6)) df['F'] = s1 # 缺省项 # 在 pandas 中使用 np.nan 作为缺省项的值。 df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E']) df1.loc[dates[0]:dates[1],'E'] = 1 # 删除所有带有缺省项的行 df1.dropna(how='any') # 填充缺省项 df1.fillna(value=5) # 获得缺省项的布尔掩码 pd.isnull(df1)
# 观察开头的数据 df.head() # 观察末尾的数据 df.tail(3) # 显示索引 df.index # 显示列 df.columns # 显示底层 numpy 结构 df.values # DataFrame 的基本统计学属性预览 df.describe() """ A B C D count 6.000000 6.000000 6.000000 6.000000 #数量 mean 0.073711 -0.431125 -0.687758 -0.233103 #平均值 std 0.843157 0.922818 0.779887 0.973118 #标准差 min -0.861849 -2.104569 -1.509059 -1.135632 #最小值 25% -0.611510 -0.600794 -1.368714 -1.076610 #正态分布 25% 50% 0.022070 -0.228039 -0.767252 -0.386188 #正态分布 50% 75% 0.658444 0.041933 -0.034326 0.461706 #正态分布 75% max 1.212112 0.567020 0.276232 1.071804 #最大值 """ # 转置 df.T # 根据某一轴的索引进行排序 df.sort_index(axis=1, ascending=False) # 根据某一列的数值进行排序 df.sort(columns='B')