导图社区 数据规整:连接、联合与重塑(基于pandas)
这是本人花费3天自学加整理出的读书笔记,算是总结了数据分析书上的内容,如果有错请指正。
编辑于2020-01-16 08:50:34数据规整:连接、联合与重塑
分层索引
总述:
概念:
允许你在一个轴向上拥有多个(两个或两个以上)索引层级。
创建:
在创建时只需重命名索引或列表,传入一个嵌套列表即可。
属性修改
标签名,索引名修改
frame.index.name
frame.columns.name
重排序与层级排序
方法:
swaplevel
sort_index
参数:
swaplevel
DataFrame.swaplevel(self,i = -2,j = -1,axis = 0 )[源代码] 在特定轴上的MultiIndex中交换级别i和j。
i,j : int,字符串(可以混合) 要交换的索引级别。可以将级别名称作为字符串传递。
sort_level
DataFrame.sortlevel(level= 0,axsi= 0,升=真,就地=假,sort_remaining =真) 按所选轴和主要级别对多级索引进行排序。数据将按字典级别按所选级别排序,然后按其他级别排序(按顺序)。
level : int 轴axis: {0或'index',1或'columns'},默认0 升序 : 布尔值,默认为True inplace:布尔值,默认为False 对DataFrame排序而不创建新实例 sort_remaining:布尔值,默认为True 也按其他级别排序。
按层级进行汇总统计
重要参数:
level
一般pandas的汇总统计函数都有这么一个参数,可以指定特定层级
使用DataFrame的列进行索引
函数
frame.set_index()
frame.reset_index()
参数:
set_index
DataFrame.set_index(键,drop=真,append=假,inplace=假,verify_integrity =假) 使用一个或多个现有列设置DataFrame索引(行标签)。默认情况下会产生一个新对象。
键:列标签或列标签/数组列表 drop:布尔值,默认为True 删除要用作新索引的列 append:布尔值,默认为False 是否将列追加到现有索引 inplace:布尔值,默认为False 修改DataFrame就位(不要创建新对象) verify_integrity:布尔值,默认为False 检查新索引是否重复。否则,将检查推迟到必要时进行。设置为False将改善此方法的性能
reset_index
DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill=”)
reset_index可以还原索引,重新变为默认的整型索引
level控制了具体要还原的那个等级的索引 drop为False则索引列会被还原为普通列,否则会丢失
联合与合并数据集
数据库风格的DataFrame连接
概念:
合并或连接操作通过一个或多个键连接行来联合数据集。pandas中的merge函数主要将各种join算法运用在你的数据上。
函数
pandas.merge
函数体
pandas.merge(left,right,how ='inner',on = None,left_on = None,right_on = None,left_index = False,right_index = False,sort = False,后缀=('_ x',' _y '),copy = True,indicator = False,validate = None ) 通过按列或索引执行数据库样式的联接操作来合并DataFrame对象。
参数:
左left: DataFrame 右right : DataFrame 方式how:{'left','right','outer','inner'},默认为'内' left:仅使用左框架中的键,类似于SQL左外部联接;保留关键顺序 right:仅使用右框架中的键,类似于SQL右外部联接;保留关键顺序 outer:使用两个框架中键的并集,类似于SQL完全外部联接;按字典顺序排序键 inner:使用两个框架中关键点的交集,类似于SQL内部联接;保留左键的顺序 on:标签或列表 要加入的列或索引级别名称。这些必须在两个DataFrame中都可以找到。如果on为None且未在索引上合并,则默认为两个DataFrame中列的交集。 left_on:标签或列表,或类似数组 要在左侧DataFrame中加入的列或索引级别名称。也可以是左侧DataFrame长度的数组或数组列表。这些数组被视为列。 right_on:标签或列表,或类似数组 要在右侧DataFrame中加入的列或索引级别名称。也可以是正确DataFrame长度的数组或数组列表。这些数组被视为列。 left_index:布尔值,默认为False 使用左侧DataFrame中的索引作为连接键。如果它是MultiIndex,则另一个DataFrame中的键数(索引或列数)必须与级别数匹配 right_index:布尔值,默认为False 使用右侧DataFrame中的索引作为连接键。与left_index相同的警告 sort:布尔值,默认为False 在结果DataFrame中按字典顺序对联接键进行排序。如果为False,则联接键的顺序取决于联接类型(how关键字) 后缀suffixes:2个长度的序列(元组,列表等) 后缀分别应用于左侧和右侧的重叠列名 复制copy:布尔值,默认为True 如果为False,请勿不必要地复制数据 指标indicator:布尔值或字符串,默认为False 如果为True,则在输出数据帧中添加一列,称为“ _merge”,其中包含有关每一行源的信息。如果为字符串,则将在每一行的源上带有信息的列添加到输出DataFrame中,并将该列命名为字符串的值。信息列为分类类型,对于其合并键仅出现在“ left” DataFrame中的观测值,其值为“ left_only”,对于其合并键仅出现在“ right” DataFrame中的观测值,其值为“ right_only”,如果两者中都存在观察值的合并键。 validate:字符串,默认为None 如果指定,则检查合并是否为指定的类型。 “ one_to_one”或“ 1:1”:检查合并键在左右数据集中是否唯一。 “ one_to_many”或“ 1:m”:检查合并键在左数据集中是否唯一。 “ many_to_one”或“ m:1”:检查合并键在正确的数据集中是否唯一。 “ many_to_many”或“ m:m”:允许,但不进行检查。
根据索引合并
概念:
在某些情况下,DataFrame中用于合并的键是它的索引,在这种情况下你就需要把leFt_index或right_index(或者两者)改为True来表示索引需要用来作为合并的键。
注意事项:
一般情况下,left_index和right_index是不动的,但是如果你想动,就是改为True,一旦修改了之后,你就是同意把赋值True的那一方的行索引作为连接键;如果那一方刚好是分层索引,那还要满足连接键数和分层数一致。
额外方法:
join
join相关事项:
原函数:
DataFrame.join(self,other,on = None,how ='left',lsuffix ='',rsuffix ='',sort = False )
函数解释:
连接另一个DataFrame的列。 将列与其他 DataFrame连接到索引或键列上。通过传递列表,一次有效地通过索引连接多个DataFrame对象。
参数:
其他other :数据 框,系列或数据框列表 索引应与此列中的一列相似。如果传递了Series,则必须设置其name属性,并将其用作结果联接的DataFrame中的列名称。 on : str,str列表或类似数组的字段,可选 调用者中的列或索引级别名称要在other中的索引上进行连接,否则将连接index-on-index。如果给出多个值,则另一个 DataFrame必须具有MultiIndex。如果调用DataFrame中尚未包含数组,则可以将其作为连接键传递。就像Excel的VLOOKUP操作一样。 方式how : {'左','右','外','内'},默认为'左' 如何处理两个对象的操作。 左:使用调用框架的索引(或列(如果已指定)) 正确:使用其他人的索引。 外部:将调用框架的索引(或指定为on的列)与其他索引建立联合,然后对其进行排序。从字典上看。 内部:调用方框架的索引(或列,如果指定为on)与其他索引的相交形式,则保留调用方的索引的顺序。 lsuffix : str,默认'' 在左框架的重叠列中使用的后缀。 rsuffix : str,默认'' 在右框架的重叠列中使用的后缀。 排序sort : 布尔值,默认为False 通过联接关键字按字典顺序对结果DataFrame进行排序。如果为False,则联接键的顺序取决于联接类型(how关键字)。
沿轴向连接
概念:
基本上就是拼接、绑定或堆叠
方法
concat
concat相关事项:
原函数:
pandas.concat(objs,axis = 0,join ='outer',join_axes = None,ignore_index = False,keys = None,level = None,names = None,verify_integrity = False,copy = True )
解释:
沿特定轴将pandas对象与其他轴上的可选设置逻辑连接起来。 也可以在串联轴上添加一层分层索引,如果标签在传递的轴号上相同(或重叠),则可能很有用。
参数:
objs:Series,DataFrame或Panel对象的序列或映射 如果传递了dict ,则除非传递了已排序的键,否则它将用作keys参数,在这种情况下,将选择值(请参见下文)。除非所有对象都为None,否则所有None对象都将被静默删除,在这种情况下,将引发ValueError 轴axis:{0 /'索引',1 /'列'},默认0 串联的轴 join:{'inner','outer'},默认为'outer' 如何处理其他轴上的索引 join_axes:索引对象的列表 用于其他n-1轴的特定索引,而不是执行内部/外部设置逻辑 ignore_index:布尔值,默认为False 如果为True,则不要沿串联轴使用索引值。结果轴将标记为0,...,n-1。如果要在串联轴没有有意义的索引信息的对象上串联,这将很有用。请注意,联接中仍会考虑其他轴上的索引值。 键keys:序列,默认无 如果通过了多个级别,则应包含元组。使用传递的键作为最外层来构造层次结构索引 级别level:序列列表,默认为无 用于构造MultiIndex的特定级别(唯一值)。否则将从按键中推断出它们 名称names:列表,默认无 所产生的层次结构索引中各层的名称 verify_integrity:布尔值,默认为False 检查新的串联轴是否包含重复项。相对于实际数据串联而言,这可能会非常昂贵 复制copy:布尔值,默认为True 如果为False,请勿不必要地复制数据
联合重叠数据
概念:
既不是合并操作,又不是连接操作,就是一般的填补之类的操作。
方法:
combine_first
combine_first相关事项:
原函数:
DataFrame.combine_first(self,other )
解释:
在other中的相同位置使用值更新null元素。 通过将一个DataFrame中的空值与其他DataFrame中的非空值一起填充来组合两个DataFrame对象。所得DataFrame的行索引和列索引将是两者的联合。
参数:
其他other : DataFrame 提供的DataFrame用于填充空值。
重塑与透视
使用多层索引进行重塑
方法:
堆叠(stack)
将列中的数据透视到行
拆堆(untack)
将行上的数据透视到列
方法解释
stack
stack()是将原来的列索引转成了最内层的行索引,这里是多层次索引,其中AB索引对应第三层,即最内层索引。
unstack
显然,unstack()是stack()的逆操作,这里把最内层的行索引还原成了列索引。但是unstack()中有一个参数可以指定旋转第几层索引,比如unstack(0)就是把第一层行索引转成列索引,但默认的是把最内层索引转层列索引。
函数相关情况
函数原型
stack
DataFrame.stack(self,level = -1,dropna = True )
unstack
DataFrame.unstack(self,level = -1,fill_value = None )
解释
stack
从列到索引堆叠指定级别。 返回一个经过重整的DataFrame或Series,与当前DataFrame相比,该DataFrame或Series具有一个或多个新的最内层的多级索引。通过旋转当前数据框的列来创建新的最内部级别: 如果列具有单个级别,则输出为系列; 如果列具有多个级别,那么新索引级别是从指定级别获取的,并且输出是DataFrame。 新索引级别已排序。
unstack
旋转一个级别的(必要的层次结构)索引标签,返回一个具有新级别列标签的DataFrame,该列标签的最内层由旋转的索引标签组成。 如果索引不是MultiIndex,则输出将是Series(列不是MultiIndex时,堆栈的模拟)。 涉及的级别将自动进行排序。
参数
stack
级别 : int,str,列表,默认-1 从列轴堆叠到索引轴的级别,定义为一个索引或标签,或索引或标签的列表。 dropna : bool,默认为True 是否在结果框架/系列中删除缺少值的行。将列级别堆叠到索引轴上可以创建原始数据帧中缺少的索引和列值的组合。
unstack
级别 : 整数,字符串或这些列表,默认为-1(最后一个级别) 要取消索引的级别,可以通过级别名称 fill_value : 如果unstack 产生,则用该值替换NaN 缺失值
将‘长’透视为‘宽’
函数:
pd.pivot
方法解释:
1.对于pivot(),如果参数values指定了不止一列作为值的话,那么生成的DataFrame的列索引就会出现层次索引,最外层的索引为原来的列标签; 2.pivot()方法其实比较容易理解,就是指定相应的列分别作为行、列索引以及值。 3.显然,用pivot()方法简单很多,可以直接通过设置相关参数实现。但是这里由于ticker和tradeDate最初就是值而不是索引,索引可以直接这样一行代码解决,若原数据中,这两列本来就是多层次的索引,那么用unstack()就会简单很多,因此,用什么方法取决于原数据的构成。
函数相关情况
函数原型
pandas.pivot(data,index = None,column = None,values = None )
解释
返回按给定的索引/列值组织的重整型DataFrame。 根据列值重塑数据(生成“数据透视表”)。使用指定索引 / 列中的唯一值形成结果DataFrame的轴。此函数不支持数据聚合,多个值将导致列中的MultiIndex。
参数
数据 : DataFrame index : 字符串或对象,可选 用于制作新框架索引的列。如果为None,则使用现有索引。 列 : 字符串或对象 用于制作新框架列的列。 values : 字符串,对象或上一个列表,可选 用于填充新框架值的列。如果未指定,将使用所有剩余的列,并且结果将具有按层次结构索引的列。 在版本0.23.0中更改:还接受列名称列表。
函数等价
这个函数算是unstack的精简版,实现功能差不多
等价比较
某种意义上,unstack()方法和pivot()方法是很像的,主要的不同在于,unstack()方法是针对索引或者标签的,即将列索引转成最内层的行索引;而pivot()方法则是针对列的值,即指定某列的值作为行索引,指定某列的值作为列索引,然后再指定哪些列作为索引对应的值。因此,总结起来一句话就是:unstack()针对索引进行操作,pivot()针对值进行操作。但实际上,两者在功能往往可以互相实现。 unstack(self, level=-1, fill_value=None)、pivot(self, index=None, columns=None, values=None,对比这两个方法的参数,这里要注意的是,对于pivot(),如果参数values指定了不止一列作为值的话,那么生成的DataFrame的列索引就会出现层次索引,最外层的索引为原来的列标签;unstack()没有指定值的参数,会把剩下的列都作为值,即把剩下的列标签都作为最外层的索引,每个索引对应一个子表。
将‘宽’透视为‘长’
函数
pandas.melt
方法解释
函数相关情况
函数原型
pandas.melt(frame,id_vars =无,value_vars =无,var_name =无,值名称= '值',col_level =无)
函数解释
将数据框从宽格式“取消透视”到长格式,可以选择保留标识符变量。 此功能对于将DataFrame按摩成一种格式非常有用,该格式中一列或多列是标识符变量(id_vars),而所有其他列(被视为测量变量(value_vars))“未透视”到行轴,仅留下两个非标识符列,“变量”和“值”。
函数参数
框架frame : DataFrame id_vars:元组,列表或ndarray,可选 用作标识符变量的列。 value_vars:元组,列表或ndarray,可选 要取消透视的列。如果未指定,则使用未设置为id_vars的所有列。 var_name:标量 用于“变量”列的名称。如果为None,则使用 frame.columns.name或“变量”。 value_name:标量,默认为'value' 用于“值”列的名称。 col_level:整数或字符串,可选 如果列是MultiIndex,则使用此级别进行融合。