目录
数据规整:连接、联合与重塑
1.分层索引
-
一个轴向上有多个索引层级
-
每个轴都可以有分层索引
-
分层的层级可以有名称,可以是字符串或者是Python对象。DataFrame.index.name
-
MultiIndex对象
-
分层索引:
S[ 'b' ]
S[ 'a' : 'c' ]
S[ ['a' , 'c']]
S[ : , 2] ---内部索引
-
unstack ---重新排序
DataFrame.unstack(level=-1,fill_value=None)
--将外层索引作为行索引,内层索引作为列索引。若数值缺失,用NaN
DataFrame.stack()
---unstack的反操作
1.1 重排序和层级排序
-
应用场景:重新排列轴上的层级顺序
DataFrame.swaplevel
(i=- 2, j=- 1, axis=0)交换DataFrame中的i和j级
默认值是交换索引的两个最内层。
Parameters
-
i, j int or str
指定交换的层级。可以将层级名称作为字符串传递。
-
axis {0 or ‘index’, 1 or ‘columns’}, default 0
指定交换层级的轴
Returns
DataFrame
在MultiIndex中交换级别的DataFrame。
注意:
1. 接收两个层级序号或层级名称; 2. 返回:一个进行了层级变更的新对象;但是原来的数据是不变的
-
-
应用场景:按照特定的层级对数据排序
DataFrame.sort_index(axis=0,level=None,ascending=True,inplace=False,kind='quicksort',na_position='last',sort_remaining=True,ignore_index=False,key=None)
按标签(沿着轴)对对象排序。
如果inplace参数为' False ',则返回一个按标签排序的新DataFrame,否则更新原来的DataFrame并返回None。
Parameters
-
axis {0 or ‘index’, 1 or ‘columns’}, default 0
进行排序的轴。
-
level int or level name or list of ints or list of level names
如果不是None,则对指定索引级别中的值进行排序。
-
ascending bool or list-like of bools, default True
升序排序还是降序排序。当索引是MultiIndex时,排序方向可以为每一层单独控制。
-
inplacebool, default False
如果为True,就地执行操作。
-
kind{‘quicksort’, ‘mergesort’, ‘heapsort’, ‘stable’}, default ‘quicksort’
-
na_position{‘first’, ‘last’}, default ‘last’
-
sort_remainingbool, default True
-
ignore_indexbool, default False
如果为真,结果轴将被标记为0,1,…,n - 1。
Returns
DataFrame or None
原始DataFrame按标签排序,如果
inplace=True
则为None。注意:
1. 默认是将最外层的索引进行排序,即axis=0 2. axis=1:将内层的索引进行排序
-
1.2 按层级进行汇总统计
level选项:
应用场景:在某个特定的层级上进行聚合
DataFrame.sum(axis=None,skipna=None,level=None,numeric_only=None,min_count=0,kwargs)
Parameters
-
axis :{index (0), columns (1)}
要应用的函数的轴。
-
level :int or level name, default None
如果轴是MultiIndex(层次结构),则沿着特定级别进行计数,折叠成Series。
Returns
-
Series or DataFrame(如果指定层级)
--按照层级在行上进行聚合: DataFrame.sum(level = 'key1') --在列上进行集合 frame.sum(level = 'color' , axis = 1)
1.3 使用DataFrame的列进行索引
应用场景:
-
使用现有列设置DataFrame索引
-
使用一个或多个现有列或数组(长度正确)设置DataFrame索引(行标签)。
-
这个索引可以替代现有的索引,也可以对其进行扩展。
DataFrame.set_index
(keys, drop=True, append=False, inplace=False, verify_integrity=False)
Parameters
-
keys :标签或数组或标签/数组的列表
该参数可以是单个列键、与调用DataFrame长度相同的单个数组,或者包含任意列键和数组组合的列表。
-
drop :bool, default True
删除要用作新索引的列。
-
inplace :bool, default False
如果是True, 就在原地修改DataFrame(不创建新对象)。
Returns
DataFrame 或者 None(inplace=TRUE时)
frame.reset_Index()
---set_Index的反操作
2 联合与合并数据集
连接和合并的区别:
以行为例:
-
合并数据集:行的最大数量是两个表行的和
-
连接数据集:行的最大数量是两个表的乘积(笛卡尔积)
pandas.merge
pandas.merge
(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('x', 'y'), copy=True, indicator=False, validate=None)
应用场景:根据一个或多个键将行进行连接。实现的是数据库的连接操作。
Parameters
-
left DataFrame
合并时操作中左边的DataFrame
-
right DataFrame
合并时操作中右边的DataFrame
-
how {‘left’, ‘right’, ‘outer’, ‘inner’}, default ‘inner’
要执行的合并类型。
-
left:对左DataFrame的所有键进行联合
-
right:对右DataFrame的所有键进行联合
-
outer:对两个DataFrame的键的并集进行联合
-
inner:对两个DataFrame的键的交集进行联合
-
-
on label or list
要连接的列或索引级别名称。这些必须在两个dataframe中找到。如果on为None且不在索引上合并,则默认为两个dataframe中的列的交集。
-
left_on label or list, or array-like
要在左DataFrame中联接的列或索引层级名称。也可以是与左侧DataFrame长度相同的数组或数组列表。这些数组被当作列来处理。
-
right_on label or list, or array-like
要在右侧DataFrame中联接的列或索引层级名称。也可以是正确DataFrame长度的数组或数组列表。这些数组被当作列来处理。
-
left_index bool, default False
使用来自左边DataFrame的索引作为连接键。如果是MultiIndex,则其他DataFrame中的键数(无论是索引还是列数)必须与层数匹配。
-
right_index bool, default False
使用右边DataFrame的索引作为连接键。与left_index相同的警告。
-
sort bool, default False
在结果DataFrame中按字典顺序排序连接键。如果为False,连接键的顺序取决于连接类型(how关键字)。
-
suffixes list-like, default is (“x”, “y”)
长度为2的序列,其中每个元素都是可选的字符串,指示要分别添加到左侧和右侧重叠列名的后缀。传递值None而不是字符串,以指示列名从左到右应该保持原样,没有后缀。至少有一个值不能为None。
-
copy bool, default True
如果为False,尽可能避免复制。
-
indicator bool or str, default False
如果为True,则在输出DataFrame中添加一个名为“_merge”的列,其中包含关于每一行的源的信息。通过提供一个字符串参数,可以为列提供一个不同的名称。对于合并键只出现在左边DataFrame的列,该列将具有一个Categorical类型,值为" left_only ",对于合并键只出现在右边DataFrame的观察,值为" right_only ",如果观察的合并键在两个DataFrame中都发现,则为" both "。
Returns
DataFrame:两个合并对象的DataFrame
2.1数据库风格的DataFrame连接
-
how:{‘left’, ‘right’, ‘outer’, ‘inner’}, default ‘inner’
要执行的合并类型。
-
left:对左DataFrame的所有键进行联合
-
right:对右DataFrame的所有键进行联合
-
outer:对两个DataFrame的键的并集进行联合
-
inner:对两个DataFrame的键的交集进行联合
-
-
on label or list
要连接的列或索引级别名称。这些必须在两个dataframe中找到。如果on为None且不在索引上合并,则默认为两个dataframe中的列的交集。
注意: 1. 多对多连接是行的笛卡尔积。 2. 使用多个键进行连接时,可以把多个键看作一个元组数据作为单个连接键使用。 3. 当连接操作后出现重叠列名时,可以使用参数suffixes添加后缀名的方式:默认重叠列名的后缀为 (“_x”, “_y”)
2.2根据索引合并
2.2.1 pandas.merge
-
left_on label or list, or array-like
使用左边DataFrame中的列或索引层级名称作为连接键。也可以是与左侧DataFrame长度相同的数组或数组列表。这些数组被当作列来处理。
-
right_on label or list, or array-like
使用右边DataFrame中的列或索引层级名称作为连接键 。也可以是正确DataFrame长度的数组或数组列表。这些数组被当作列来处理。
-
left_index bool, default False
使用来自左边DataFrame的索引作为连接键。如果是MultiIndex,则其他DataFrame中的键数(无论是索引还是列数)必须与层数匹配。
-
right_index bool, default False
使用右边DataFrame的索引作为连接键。与left_index相同的警告。
2.2.2 DataFrame.merge
DataFrame.merge(right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('x', 'y'), copy=True, indicator=False, validate=None)
2.3沿轴向连接
拼接、绑定或者堆叠
2.3.1 Numpy.concatenate
numpy.concatenate ((a1, a2, ...), axis=0, out=None, dtype=None, casting="same_kind")
沿着现有的轴连接数组序列。
参数
-
a1, a2, … sequence of array_like
数组必须具有相同的形状,除了与axis(默认为第一个)对应的维度。
-
axis int, optional
数组将沿着的轴。如果axis为None,则数组在使用前被平铺。默认值为0
-
out ndarray, optional
如果提供,则放置结果的目的地。形状必须是正确的,匹配如果没有指定out参数的话,concatate将返回的形状。
-
dtype str or dtype
如果提供,目标数组将具有这个dtype。不能与out一起提供。
返回值
ndarray,连接后的数组。
2.3.2 Pandas.concat
pandas.concat (objs, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=False, copy=True)
沿着特定的轴用可选的设置逻辑沿着其他轴连接Pandas对象。
还可以在连接轴上添加层次索引层,如果传递的轴号上的标签相同(或重叠),这可能很有用。
Parameters
-
objs Series或DataFrame对象的列表或者字典
-
axis {0/’index’, 1/’columns’}, default 0
沿着连接的轴
-
join {‘inner’, ‘outer’}, default ‘outer’
如何处理其他轴上的索引。
-
join_axis list
指定其他轴的特定索引。
-
ignore_index bool, default False
如果为True,则不要沿连接轴使用索引值。结果轴将被标记为0,…,n - 1。如果串联轴没有有意义的索引信息,那么这将非常有用。注意,其他轴上的索引值在连接中仍然使用。
-
keys sequence, default None
沿着连接轴形成多层索引;可以是任意值的列表或者数组,也可以是元组的数组(如果向levels参数传入多层数组)
-
levels list of sequences, default
用于指定MultiIndex的层级(唯一值)。否则将从keys推断它们。
-
names list, default None
生成的多层索引中的层级名称。
-
verify_integrity bool, default False
检查新的连接轴是否有重复。
-
sort bool, default False
当join为' outer '时,如果未对齐,则对非连接轴进行排序。当' join='inner' '时,这没有影响,因为它已经保留了非连接轴的顺序。在1.0.0版更改:更改为默认不排序。
-
copy bool, default True
如果为False,则不复制不必要的数据。
Returns
object, type of objs
当沿着索引(axis=0)连接所有' Series '时,返回一个' Series '。当' obj '包含至少一个' DataFrame '时,返回一个' DataFrame '。当沿着列连接时(axis=1),将返回一个' DataFrame '。
2.4 联合重叠数据
DataFrame.combine_first (other)
Update null elements with value in the same location in other.
通过将一个DataFrame中的非空值填充到另一个DataFrame中的空值来组合两个DataFrame对象。生成的DataFrame的行索引和列索引将是两者的并集。
Parameters
-
other:DataFrame提供用于填充空值的DataFrame。
Returns
DataFrame
将提供的DataFrame与另一个对象相结合的结果。
3 重塑
3.1 使用多层索引进行重塑
stack:堆叠;该操作会旋转或将列中的数据透视到行
Unstack:拆堆;该操作会将行中的数据透视到列
DataFrame.unstack (level=- 1, fill_value=None)
透视一层索引标签(必须分层)。
返回一个DataFrame,该DataFrame具有新层级的列标签,其最内层标签由被拆堆的层级标签组成。
如果索引不是MultiIndex,则输出将是Series(当列不是MultiIndex时,类似于堆栈)。
-
Parameters
-
level:int, str, or list of these, default -1 (last level)
要拆堆的索引层级,可以传递层级的名称。
-
fill_value:int, str or dict
如果拆堆生成缺失的值,则使用此值替换NaN。
-
-
Returns
Series or DataFrame
DataFrame.stack(level=- 1, dropna=True)
将指定的级别从列堆叠到索引。
返回一个经过重塑的DataFrame或Series,与当前的DataFrame相比,该DataFrame具有一个或多个新的最内部层的分层索引。新的最内层是通过旋转当前数据的列来创建的:
-
如果列只有一个层级,则输出为Series;
-
如果列有多个层级,则新索引层级取自指定层级,输出为DataFrame。
-
Parameters
-
level int, str, list, default -1
从列轴堆叠到索引轴的层级,索引轴定义为一个索引或标签,或一组索引或标签。
-
dropna bool, default True(默认过滤缺失数据)
是否在得到的Frame/Series中删除缺少值的行。将列级堆叠到索引轴上可以创建原始数据中缺失的索引值和列值的组合。
-
-
Returns
DataFrame or SeriesStacked dataframe or series.
3.2 将长透视为宽
DataFrame.pivot
(index=None, columns=None, values=None)
返回按给定索引/列值组织的重塑的DataFrame。
基于列值重构数据(生成一个“pivot”表)。使用来自指定索引/列的唯一值来形成结果DataFrame的轴。此函数不支持数据聚合,多个值将导致列中的MultiIndex。
-
Parameters
index:str or object or a list of str, optional
用于行索引的列
columns:str or object or a list of str
用于列索引的列
values:str, object or a list of the previous, optional
用于填充新数据的列。如果未指定,则将使用所有剩余的列,并且结果将具有分层索引的列。
-
Returns
DataFrame
返回重塑的DataFrame。
3.3 将宽透视为长
DataFrame.melt
(id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None, ignore_index=True)[source]
将DataFrame从宽格式改为长格式,可选地保留标识符。
Parameters
-
id_vars tuple, list, or ndarray, optional
要用作标识符变量的列。分组指标。
-
value_vars tuple, list, or ndarray, optional
列透视,指定列的子集。如果未指定,则使用所有未设置为id_vars的所有列。
-
var_name scalar
为“变量”列使用的名称。 If None it uses
frame.columns.name
or ‘variable’. -
value_name scalar, default ‘value’
为' value '列使用的名称。
-
col_level int or str, optional
如果列是MultiIndex,则使用此级别进行融化。
-
ignore_index bool, default True
如果为True,则忽略原始索引。如果为False,则保留原索引。索引标签将根据需要重复。