Pandas的数据结构
pandas 中使用Series和DataFrame对象存储数据
Series
1.什么是Series
Series是一种类似与一维数组的对象,由下面两个部分组成:
values:一组数据(ndarray类型)
index:相关的数据索引标签
2.如何创建Series
(1) 由列表或numpy数组创建
默认索引为0到N-1的整数型索引
可以通过设置index参数指定索引
特别地,由ndarray创建的是引用,而不是副本。对Series元素的改变也会改变原来的ndarray对象中的元素。(列表没有这种情况)
(2) 由字典创建
3.Series的索引和切片
可以使用中括号取单个索引(此时返回的是元素类型),或者中括号里一个列表取多个索引(此时返回的仍然是一个Series类型)。分为显示索引和隐式索引:
(1) 显式索引:
使用index中的元素作为索引值
使用.loc[](推荐)
注意: 此时是闭区间
(2) 隐式索引:
使用整数作为索引值
使用.iloc[](推荐)
注意: 此时是半开区间
4.Series的基本属性
可以把Series看成一个定长的有序字典
可以通过shape,size,index,values等得到series的属性
可以通过head(),tail()快速查看Series对象的样式
当索引没有对应的值时,可能出现缺失数据显示NaN(not a number)的情况
可以使用pd.isnull(),pd.notnull(),或自带isnull(),notnull()函数检测缺失数据
5.Series的运算
(1) 适用于numpy的数组运算也适用于Series
(2) Series之间的运算
在运算中自动对齐不同索引的数据
如果索引不对应,则补NaN
注意:要想保留所有的index,则需要使用.add()函数
DataFrame
1.什么是DataFrame
DataFrame是一个【表格型】的数据结构,可以看做是【由Series组成的字典】(共用同一个索引)。DataFrame由按一定顺序排列的多列数据组成。设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。
行索引:index
列索引:columns
值:values(numpy的二维数组)
2.如何创建DataFrame
最常用的方法是传递一个字典来创建。DataFrame以字典的键作为每一【列】的名称,以字典的值(一个数组)作为每一列。
此外,DataFrame会自动加上每一行的索引(和Series一样)。
同Series一样,若传入的列与字典的键不匹配,则相应的值为NaN。
DataFrame属性:values、columns、index、shape
3.DataFrame的索引
(1) 对列进行索引
通过类似字典的方式
通过属性的方式
可以将DataFrame的列获取为一个Series。返回的Series拥有原DataFrame相同的索引,且name属性也已经设置好了,就是相应的列名。
(2) 对行进行索引
使用.ix[]来进行行索引
使用.loc[]加index来进行行索引
使用.iloc[]加整数来进行行索引
同样返回一个Series,index为原来的columns
(3) 对元素索引的方法
使用列索引
使用行索引(iloc[3,1]相当于两个参数;iloc[[3,3]] 里面的[3,3]看做一个参数)
使用values属性(二维numpy数组)
注意: 直接用中括号时
索引表示的是列索引
切片表示的是行切片
4.DataFrame的运算
在运算中自动对齐不同索引的数据
如果索引不对应,则补NaN
(2) Series与DataFrame之间的运算
【重要】
使用Python操作符:以行为单位操作(参数必须是行),对所有行都有效。(类似于numpy中二维数组与一维数组的运算,但可能出现NaN)
使用pandas操作函数:
axis=0:以列为单位操作(参数必须是列),对所有列都有效。
axis=1:以行为单位操作(参数必须是行),对所有行都有效。
处理丢失数据
None
None是Python自带的,其类型为python object。因此,None不能参与到任何计算中。
object类型的运算要比int类型的运算慢得多
np.nan(NaN)
np.nan是浮点类型,能参与到计算中。但计算的结果总是NaN。
但可以使用np.nan*()函数来计算nan,此时视nan为0。
pandas中的None与NaN
1) pandas中None与np.nan都视作np.nan
2) pandas中None与np.nan的操作
判断函数
isnull()
notnull()
过滤函数
dropna(): 过滤丢失数据
fillna(): 填充丢失数据
层次化索引
1. 创建多层行索引
1) 隐式构造
最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组
Series也可以创建多层索引
2) 显示构造pd.MultiIndex
使用数组
使用元组
使用product(最简单,推荐使用)
2.多层列索引同上
3.多层索引对象的索引与切片操作
1)Series的操作
重要:对于Series来说,直接中括号[]与使用.loc()完全一样,因此,推荐使用中括号索引和切片。
2)DataFrame操作
(1) 可以直接使用列名称来进行列索引
(2) 使用行索引需要用ix(),loc()等函数
极其重要:推荐使用loc()函数
注意在对行索引的时候,若一级行索引还有多个,对二级行索引会遇到问题!也就是说,无法直接对二级索引进行索引,必须让二级索引变成一级索引后才能对其进行索引!
4.索引的堆(stack)
unstack()
stack()
小技巧:使用stack()的时候,level等于哪一个,哪一个就消失,出现在行里。
小技巧:使用unstack()的时候,level等于哪一个,哪一个就消失,出现在列里
5.聚合操作
平均数,方差,最大值,最小值……
pandas的拼接操作
pandas的拼接分为两种:
级联:pd.concat, pd.append
合并:pd.merge, pd.join
pd.concat()
1).简单级联
pandas使用pd.concat函数,与np.concatenate函数类似,只是多了一些参数:
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,keys=None, levels=None, names=None, verify_integrity=False,copy=True)
和np.concatenate一样,优先增加行数(默认axis=0),可以通过设置axis来改变级联方向
注意 index在级联时可以重复 也可以选择忽略ignore_index,重新索引
或者使用多层索引 keys concat([x,y],keys=['x','y'])
2).不匹配级联
不匹配指的是级联的维度的索引不一致。例如纵向级联时列索引不一致,横向级联时行索引不一致
有3种连接方式:
外连接:补NaN(默认模式)
内连接:只连接匹配的项
连接指定轴 join_axes
3) 使用append()函数添加
级联的使用非常普遍,因此有一个函数append专门用于在后面添加
pd.merge()
merge与concat的区别在于,merge需要依据某一共同的行或列来进行合并
使用pd.merge()合并时,会自动根据两者相同column名称的那一列,作为key来进行合并。
注意每一列元素的顺序不要求一致
1) 一对一合并
2) 多对一合并
3) 多对多合并
4) key的规范化
使用on=显式指定哪一列为key,当有多个key相同时使用
使用left_on和right_on指定左右两边的列作为key,当左右两边的key都不想等时使用
5) 内合并与外合并
内合并:只保留两者都有的key(默认模式)
外合并 how='outer':补NaN
左合并、右合并:how='left',how='right'
6) 列冲突的解决
当列冲突时,即有多个列名称相同时,需要使用on=来指定哪一个列作为key,配合suffixes指定冲突列名,可以使用suffixes=自己指定后缀