Python学习笔记----Pandas教程
PandasPandas 是基于 NumPy 的一个开源 Python 库,它被广泛用于快速分析数据,以及数据清洗和准备等工作。它的名字来源是由“ Panel data”(面板数据,一个计量经济学名词)两个单词拼成的。Pandas提供了高性能的数据结构和数据分析工具,其关键点在于有一个快速且高效的DataFrame,Series对象,能够通过索引高效地对数据进行处理。DataFrame结构可视为.
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)
更多推荐
所有评论(0)