Pandas全称”Python Data Analysis Library”,是python的数据分析库。
本文仅列举在各类机器学习项目中常用的一些功能。更多功能详见官方文档。
本文参考了官方文档的《10分钟速成pandas》。
1 2 3 4 5
| import numpy as np import pandas as pd import matplotlib.pyplot as plt %matplotlib inline
|
数据类型
Pandas提供两种数据类型:Series和DataFrame。
Series是带索引的一维数据结构,如果未指定索引,则以数字自动生成。
1 2
| s = pd.Series([1,3,5,np.nan,6,8])
|
DataFrame是二维数据结构,数据以行和列构成,每一行和每一列都是Series对象。
1 2 3 4 5 6 7 8 9 10 11 12 13
| df = pd.DataFrame(np.random.randn(6,4), columns=['A', 'B', 'C', 'D'])
dates = pd.date_range('20180101', periods=6) df = pd.DataFrame({ 'A' : pd.date_range('20180101', periods=6), 'B' : np.random.randn(6), 'C' : s.values, 'D' : np.array([3] * 6, dtype='int32'), 'E' : pd.Categorical(["train", "train", "test", "train", "test", "train"]), 'F' : 'foo' })
|
查看数据
描述性统计
Pandas的一大功能是对数据进行探索性数据分析(Exploratory Data Analysis)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| df.shape
df.head(5)
df.tail(5)
df.index
df.columns
df.values
df.dtypes
|
索引
索引是由行标签构成的列,一张表可以有不止一个索引列。未指定索引列时,默认使用从0开始的行号作为索引。
1 2 3 4 5 6
| df.index
df.set_index('A')
df.reset_index(drop=True)
|
统计量
诸如求和(sum
)等方法只对数值型的列有效,而求众数(mode
)等方法对字符型的列也有效。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| df.describe()
df.sum()
df.count()
df.mean()
df.std()
df.median()
df.mode()
df.skew()
df.kurt()
|
协方差、相关系数
DataFrame对象调用这两个方法会对全部数值型的列相互进行计算。Series对象调用这两个方法需要指定另一个Series对象。
1 2 3 4 5 6 7 8 9
| df.cov()
df.corr()
df['B'].cov(df['C'])
df['B'].corr(df['C'])
|
排序
DataFrame有两种排序方法:sort_values
按照值排序,sort_index
按照索引号排序。
1 2 3 4
| df.sort_index(axis=1, ascending=False)
df.sort_values(by=['B'])
|
选择
选中
直接索引:使用类似字典的索引方法得到的是列,使用切片得到的是行。
1 2 3 4 5 6 7
| df['A'] df.A
df[['A', 'B']]
df[1:3]
|
此外还有loc
和iloc
两种方法用于选中操作,loc
是基于索引标签的,而iloc
基于位置(即行号)的。
loc
:传入的第一个参数是索引列的标签。当索引是默认的行号时,要注意和iloc
的区别。此方法切片时,注意冒号左右两边的行都会被选取到。
1 2 3 4 5 6 7 8 9
| df.loc[1]
df.loc[1:3, 'B':'E']
df.loc[[1, 3], ['B','D']]
df.loc[1, 'B'] df.at[1, 'B']
|
iloc
:传入的第一个参数是索引所在的位置,即行号。
1 2 3 4 5 6 7 8 9
| df.iloc[3]
df.iloc[3:5, :2]
df.iloc[[1,2,4],[0,2]]
df.iloc[1,1] df.iat[1,1]
|
条件筛选
可以用逻辑运算符连接多个条件表达式以进行复合筛选。
1 2 3 4 5 6 7 8
| df[df.B > 0]
df[(df.B > 0) & (df.E=='test') ]
df[df['E'].isin(['train'])]
df.loc[df.B > 0, ['C']]
|
分组
对数据表进行分组,可以直观显示所需的部分数据、对部分数据运用函数或者利用所需数据构建新的数据表。可以利用groupby
方法实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| df4 = pd.DataFrame({ 'A' : ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'], 'B' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'], 'C' : np.random.randn(8), 'D' : np.random.randn(8) })
df4.groupby('A').sum()
df4.groupby(['A', 'B']).sum()
|
增删改
选中元素之后可以进行诸如赋值、改变数据类型等操作。
注意:涉及到对数据进行更改的方法,都会有inplace
这个参数,默认值为False
,不对原对象修改,创建副本并返回修改后的新值,设置为True
时则不创建新的对象,直接对原始对象进行修改。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| df.T
df['C'].dtype
df['C'].astype('str')
df['C'].unique()
df['C'].isnull()
df['C'].rename('newC')
df['C'].drop_duplicates()
df['C'].replace(8., 9.)
df['E'].value_counts()
df['E'].str.upper()
df['B'].apply(lambda x:x**2)
|
合并数据表
Pandas提供了concat
、append
、merge
三种方法进行数据表合并。
concat
:一种基本的数据表合并方式,支持横向和纵向合并。它主要接收以下参数:
axis
:合并的方向,默认为0表示纵向合并。
ignore_index
:是否重置索引,默认为False
,这时保留原数据表的索引,设置为True
则重置为新的索引。
join
:默认为outer
,表示取并集,若设置为inner
则取交集。
join_axes
:指定合并后采用的索引。
1 2 3 4 5
| df1 = df = pd.DataFrame(np.random.randn(2, 4), columns=['a','b','c','d']) df2 = df = pd.DataFrame(np.random.randn(3, 4), columns=['a','b','c','d']) df3 = df = pd.DataFrame(np.random.randn(2, 3), columns=['a','b','c'])
pd.concat([df1, df2, df3], join='inner', ignore_index=True)
|
append
:用法类似于concat
,但只能纵向合并。
1
| df1.append(df3, ignore_index=True)
|
merge
:与concat
的主要区别在于用on
参数指定要连接的键。
on
:指定要连接的一个或多个键,这个键在两张表中是一致的。
how
:连接的方法,可选inner
(取交集,默认)、outer
(取并集)、left
(以左表为主)、right
(以右表为主)。
1 2 3 4
| left = pd.DataFrame({'key': ['foo', 'bar'], 'lval': [1, 2]}) right = pd.DataFrame({'key': ['foo', 'bar'], 'rval': [4, 5]})
pd.merge(left, right, on='key')
|
缺失值
Pandas中,缺失值用NaN
表示,当创建DataFrame对象时,使用np.nan
代表缺失值。
DataFrame对象使用isnull
方法会返回一个布尔矩阵,显示每个位置是否是缺失值。可以灵活运用这一函数来定位缺失值。
1 2 3 4 5 6 7 8 9 10 11 12
| df4 = pd.DataFrame([[0,1,2],[3,np.nan,np.nan],[4,np.nan,np.nan],[5,np.nan,6],[7,8,9]])
df4.isnull()
df4.isnull().any()
df4[df4.isnull().values==True]
df4.isnull().sum()
(df4.isnull().sum()/df4.isnull().count()).sort_values(ascending=False)
|
Pandas提供了一些基础的处理缺失值的方法。
1 2 3 4 5 6 7 8
| df4.dropna(how='any')
df4.fillna(value=10.)
df4.fillna(method='ffill', axis=1)
df4.fillna(method='bfill')
|
绘图
Series和DataFrame对象都具有快速绘图的功能。它们用法与matplotlib类似,可以参考我的另一篇文章:《Python机器学习库笔记(2)——matplotlib.pyplot》,本文不再赘述。
1 2 3 4 5 6 7 8 9 10 11
| ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2016', periods=1000)) ts = ts.cumsum() ts.plot()
df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=['A', 'B', 'C', 'D']) df = df.cumsum() plt.figure() df.plot() plt.legend(loc='best')
|
文件读写
Pandas支持读取csv、hdf5以及xlsx等类型的文件。
1 2 3 4 5 6 7 8 9 10 11 12
| pd.read_csv('input.csv')
df.to_csv('output.csv')
pd.read_hdf('input.h5', 'df')
df.to_hdf('output.h5', 'df')
pd.read_excel('input.xlsx', 'Sheet1', index_col=None, na_values=['NA'])
df.to_excel('output.xlsx', sheet_name='Sheet1')
|