Pandas
Pandas 是基于 NumPy 的一个开源 Python 库,它被广泛用于快速分析数据,以及数据清洗和准备等工作。它的名字来源是由“ Panel data”(面板数据,一个计量经济学名词)两个单词拼成的。Pandas提供了高性能的数据结构和数据分析工具,其关键点在于有一个快速且高效的DataFrame,Series对象,能够通过索引高效地对数据进行处理。DataFrame结构可视为一个电子表格(类似于Excel),可通过重塑(reshape),添加(或删除)列与行,聚合,合并,连接数据集等功能,可导入或导出不同格式的数据如CSV,文本文件,微软Excel,SQL数据可和HDF5等,此外Pandas提供了Matplotlib接口。
Pandas的数据结构
数据结构 原理 基本创建方法 备注 Series Series 基本上就是基于 NumPy 的一维数组对象来创建的。和 NumPy 的一维数组不同,Series中的每一个值都可以自定义标签,也就是索引(index),然后通过索引来访问该数组中的数据。 my_series=pd.Series(list,index) data 参数可以是任意数据对象,比如字典、列表甚至是 NumPy 数组,而index 参数则是对 data 的索引值,类似字典的 key DataFrame 二维表格式数据结构,包括行和列,行有一个特定的索引来访问,可以是任何的值和名称,列就是Series my_df=pd.DataFrame(dict,index) 通过字典(字典的key就是列的名称,value为列表或Series)
注: Pandas对 Series 的算术运算都是基于 index 进行的,Pandas 将会根据索引 index,对响应的数据进行计算,如果 Pandas 在两个 Series 里找不到相同的 index,对应的位置就返回一个空值 NaN。
import pandas as pd
data = {'year': [2010, 2011, 2012, 2010, 2011, 2012, 2010, 2011, 2012],
'team': ['FCBarcelona', 'FCBarcelona', 'FCBarcelona', 'RMadrid', 'RMadrid', 'RMadrid', 'ValenciaCF',
'ValenciaCF', 'ValenciaCF'],
'wins': [30, 28, 32, 29, 32, 26, 21, 17, 19],
'draws': [6, 7, 4, 5, 4, 7, 8, 10, 8],
'losses': [2, 3, 2, 4, 2, 5, 9, 11, 11]
}
football = pd.DataFrame(
data, columns=['year', 'team', 'wins', 'draws', 'losses'])
football
DataFrame的属性和方法
1.DataFrame信息查看
操作 执行代码 返回内容 查看维度 df.shape 二维元祖 数据表基本信息(维度、列名称、数据格式、所占空间等) df.info ()每一列数据的格式 df.dtypes 某一列格式 df[‘col1’].dtype 判断所有单元格是否为空 df.isnull() 元素为true或false的矩阵 判断某一列空值 df[‘col1’].isnull() 返回某一列的唯一值 df[‘col1’].unique() 某一列的唯一值的numpy数组 数据表的值 df.values Python二维列表 查看列名称 df.columns Python列表 查看前10行数据、后10行数据 df.head(),df.tail() DataFrame
2.数据清洗
操作 执行代码 返回内容 用数字0填充空值 df.fillna(value=0) 使用列col1的均值对该列的NA进行填充 df[‘col1’].fillna(df[‘col1’].mean()) 清除col2字段的字符空格 df[‘col2’]=df[‘col2’].map(str.strip) 大小写转换 df[‘col2’]=df[‘col2’].str.lower() 更改数据格式 df[‘col1’].astype(‘int’) 更改列名称 df.rename(columns={‘col1’: ‘col1new’}) 删除后出现的重复值 df[‘col1’].drop_duplicates() 删除先出现的重复值 df[‘col1’].drop_duplicates(keep=‘last’) 数据替换 df[‘city’].replace(‘sh’, ‘shanghai’)
3.数据表合并
merge
merge()是对DataFrame进行行连接的,对于两个DataFrame,可以用参数on指定用来merge的共同列,也可以利用left_on和right_on分别指定用来merge的列,还可以利用how参数指定merge的方式,how可以为inner、outer、left、right,默认为inner。表示以两者交集方式merge,outer表示并集,left表示以左边的df为准,right表示以右边的df为准;如果指定merge的列元素不是唯一的,是多对多的,则以笛卡尔积的形式merge,保证merge后不遗漏数据;此外,还可以利用left_index和right_index布尔参数进行索引merge,利用sort布尔参数选择是否merge排序等。
操作 执行代码 df_inner=pd.merge(df,df1,how=‘inner’) 匹配合并,交集,默认是两个数据集相同的字段 df_left=pd.merge(df,df1,how=‘left’) ) 左连接 df_right=pd.merge(df,df1,how=‘right’) 右连接 df_outer=pd.merge(df,df1,how=‘outer’) 并集
注:
on 用于连接的列名,必须同时存在于左右两个DataFrame对象中,如果位指定,则以left和right列名的交集作为连接键 left_on 左侧DataFarme中用作连接键的列 right_on 右侧DataFarme中用作连接键的列
join
如果是直接根据索引进行合并的话,DataFrame有一个直接的join()方法,默认按索引合并
操作 执行代码 左连接 result = left.join(right, on=‘key’)
concat
轴向连接,就是直接将多个Series或者DataFrame按某个轴的方向进行连接。这不同于merge和join,轴向连接不是指定某个列进行合并,而是直接将多个对象沿着指定的轴进行堆叠,不管这个轴的索引上多个对象是否有重复值。 concat()实际上就是沿着某个轴进行堆叠。此外concat()还有一个比较重要的参数是join,值可为inner和outer,默认为outer,表示除了指定堆叠的轴外的其他轴上的合并方式,默认为并集。
## 例子说明pandas常用的三种concat
# (1)axis为1进行concat
In[10]:df4=pd.concat([df1,df2],axis=1,keys=['df1','df2'])
In[11]:df4
Out[11]:
df1 df2
n1 n2 n3 n4 n1 n5 n4
four NaN NaN NaN NaN 11.0 12.0 b
one 0.0 1.0 2.0 a NaN NaN NaN
six NaN NaN NaN NaN 13.0 14.0 d
three 6.0 7.0 8.0 c NaN NaN NaN
two 3.0 4.0 5.0 b 9.0 10.0 a
# (2)axis为0进行concat
In[12]:df5=pd.concat([df1,df2],axis=0,keys=['df1','df2'])
In[13]:df5
Out[13]:
n1 n2 n3 n4 n5
df1 one 0 1.0 2.0 a NaN
two 3 4.0 5.0 b NaN
three 6 7.0 8.0 c NaN
df2 two 9 NaN NaN a 10.0
four 11 NaN NaN b 12.0
six 13 NaN NaN d 14.0
# (3)axis为0进行concat,但axis为1合并方式为交集
In[14]:df6=pd.concat([df1,df2],axis=0,keys=['df1','df2'],join='inner')
In[15]:df6
Out[15]:
n1 n4
df1 one 0 a
two 3 b
three 6 c
df2 two 9 a
four 11 b
six 13 d
append
操作 执行代码 纵向合并 result = df1.append(df2)
4.数据预处理
操作 执行代码 注意事项 根据列id设置索引列 df.set_index(‘id’) 按照索引列排序 df.sort_index() 按照特定列的值排序 df.sort_values(by=[‘col1’]) 根据col1按条件分组标记 df[‘col1’] = np.where(df[‘col1’] > 3000,’high’,’low’) np.where(condition,x,y)满足条件(condition),输出x,不满足输出y 对复合多个条件的数据进行分组标记 df.loc[(df[‘city’] == ‘beijing’) & (df[‘price’] >= 4000), ‘sign’]=1 loc只能通过index和列名来用;iloc可以通过类似于list的索引(位置)来取;ix可以通过混合提取
5.数据提取
主要用到的三个函数:loc,iloc和ix,loc函数按标签值进行提取,iloc按位置进行提取,ix可以同时按标签和位置进行提取
操作 执行代码 备注 按索引名称提取单行的数值 df.loc[3] 按索引位置提取区域行数值 df.iloc[0:5] 重设索引 df.reset_index() 设置日期为索引 df=df.set_index(‘date’) 需要列date存在 提取4日之前的所有数据 df[:’2013-01-04’] 使用iloc按位置区域提取数据 df_inner.iloc[:3,:2] #冒号前后的数字不再是索引的标签名称,而是数据所在的位置,从0开始,前三行,前两列 iloc按位置单独提起数据 df.iloc[[0,2,5],[4,5]] 提取第0、2、5行,4、5列 使用ix按索引标签和位置混合提取数据 df.ix[:’2013-01-03’,:4] 2013-01-03号之前,前四列数据 判断city列的值是否为北京 df[‘city’].isin([‘beijing’]) 返回元素为bool的Series 判断city列里是否包含beijing和shanghai,然后将符合条件的数据提取出来 df.loc[df[‘city’].isin([‘beijing’,’shanghai’])]
6.数据筛选
使用与、或、非三个条件配合大于、小于、等于对数据进行筛选,并进行计数和求和。
操作 代码 备注 使用“与”进行筛选 df.loc[(df[‘age’] > 25) & (df[‘city’] == ‘beijing’), [‘id’,’city’,’age’,’category’,’gender’]] 返回满足条件的DataFrame 使用“或”进行筛选 df.loc[(df_inner[‘age’] > 25) | (df[‘city’] == ‘beijing’), [‘id’,’city’,’age’,’category’,’gender’]].sort([‘age’]) 返回满足条件的DataFrame 使用“非”条件进行筛选 df.loc[(df[‘city’] != ‘beijing’), [‘id’,’city’,’age’,’category’,’gender’]].sort([‘id’]) 返回满足条件的DataFrame 对筛选后的数据按city列进行计数 df.loc[(df[‘city’] != ‘beijing’), [‘id’,’city’,’age’,’category’,’gender’]].sort([‘id’]).city.count() .count()对返回的Series进行操作 使用query函数进行筛选 df.query(‘city '== [“beijing”, “shanghai”]) 对筛选后的结果按prince进行求和 df.query(‘city == [“beijing”, “shanghai”]’).price.sum() .sum()对返回的Series进行操作
7.数据汇总
主要函数是groupby和pivote_table
操作 代码 备注 按城市对所有的列进行计数汇总 df.groupby(‘city’).count() 分组运算groupby,返回元素为元组(组别,DataFrame)的生成器, 按城市对id字段进行计数 df.groupby(‘city’)[‘id’].count() 对两个字段进行汇总计数 df.groupby([‘city’,’size’])[‘id’].count() 对city字段进行汇总,并分别计算prince的合计和均值 df.groupby(‘city’)[‘price’].agg([len,np.sum, np.mean]) agg 方法将一个函数使用在一个数列上,然后返回一个标量的值。也就是说agg每次传入的是一列数据,对其聚合后返回标量;传入列表可进行多种运算,传入字典可对不同的列应用不同的聚合函数
8.数据统计
数据采样,计算标准差,协方差和相关系数
操作 代码 备注 简单的数据采样 df.sample(n=3) 返回行数目为3的DataFrame 手动设置采样权重 df.sample(n=2, weights= [0, 0, 0, 0, 0.5, 0.5] ) 采样后不放回 df.sample(n=6, replace=False) 采样后放回 df.sample(n=6, replace=True) 数据表描述性统计 df.describe().round(2).T round函数设置显示小数位,T表示转置 计算列的标准差 df_inner[‘price’].std() 计算两个字段间的协方差 df[‘col1’].cov(df[‘m-point’]) 数据表中所有字段间的协方差矩阵 df.cov() 返回DataFrame 两个字段的相关性分析 df[‘price’].corr(df[‘m-point’]) 相关系数在-1到1之间,接近1为正相关,接近-1为负相关,0为不相关 数据表的相关性分析 df_inner.corr() 返回DataFrame
9.数据输出
分析后的数据可以输出为xlsx格式和csv格式
操作 代码 备注 写入Excel df.to_excel(‘excel_to_python.xlsx’, sheet_name=’bluewhale_cc’) 写入到CSV df.to_csv(‘excel_to_python.csv’)
10. 将Pandas中的DataFrame类型转换成Numpy中array类型
操作 代码 备注 将Pandas中的DataFrame类型转换成Numpy中array类型 df.values 将Pandas中的DataFrame类型转换成Numpy中array类型 df.as_matrix() 将Pandas中的DataFrame类型转换成Numpy中array类型 np.array(df)
# 三种方法均可
import numpy as np
import pandas as pd
df=pd.DataFrame({'A':[1,2,3],'B':[4,5,6],'C':[7,8,9]})
df
df.values
df.as_matrix()
np.array(df)