详解Pandas用法_01
原文地址:http://www.huaxiaozhuan.com/%E5%B7%A5%E5%85%B7/pandas/chapters/pandas.html
pandas 0.19
一、基本数据结构
-
Pandas
的两个主要数据结构:Series
和DateFrame
1. Series
-
创建:
class pandas.Series(data=None, index=None, dtype=None, name=None, copy=False,fastpath=False)
:参数:
-
data
:它可以是一个字典、array-like
、标量。表示Series
包含的数据,如果是序列/数组,则它必须是一维的 - 如果是字典,则字典的键指定了
label
。如果你同时使用了index
,则以index
为准。 - 如果是标量,则结果为:该标量扩充为
index
长度相同的列表。 -
index
:一个array-like
或者一个Index
对象。它指定了label
。其值必须唯一而且hashable
,且长度与data
一致。如果data
是一个字典,则index
将会使用该字典的key
(此时index
不起作用)。如果未提供,则使用np.arange(n)
。 -
name
:一个字符串,为Series
的名字。 -
dtype
:指定数据类型。如果为None
,则数据类型被自动推断 -
copy
:一个布尔值。如果为True
,则拷贝输入数据data
-
-
还可以通过类方法创建
Series
:Series.from_array(arr, index=None, name=None, dtype=None,
copy=False, fastpath=False)
:其中arr
可以是一个字典、array-like
、标量。其他参数见1. -
我们可以将
Series
转换成其他数据类型:-
.to_dict()
:转换成字典,格式为{label->value}
-
.to_frame([name])
:转换成DataFrame
。name
为Index
的名字 -
.tolist()
:转换成列表
-
-
可以将
Series
转换成字符串:.to_string(buf=None, na_rep='NaN', float_format=None, header=True, index=True,
length=False, dtype=False, name=False, max_rows=None)
-
buf
:一个StringIO-like
对象,是写入的buffer
-
na_rep
:一个字符串,代表数值NaN
-
float_format
:浮点数的格式化函数。应用于浮点列 -
header
:一个布尔值。如果为True
,则添加头部信息(index name
) -
index
:一个布尔值。如果为True
,则添加index labels
-
length
:一个布尔值。如果为True
,则添加Series
的长度信息 -
dtype
:一个布尔值。如果为True
,则添加dtype
信息 -
name
:一个布尔值。如果为True
,则添加Series name
-
max_rows
:一个整数值,给出了最大转换的行数。如果为None
,则转换全部。
返回转换后的字符串。
-
2. Index
-
class pandas.Index(data=None, dtype=None, copy=False, name=None,
fastpath=False, tupleize_cols=True)
:创建Index
对象。参数:
-
data
:一个array-like
,必须是一维的 -
name
:一个字符串,为Index
的名字。 -
dtype
:指定数据类型。如果为None
,则默认为object
-
copy
:一个布尔值。如果为True
,则拷贝输入数据data
-
tupleize_cols
:一个布尔值,如果可能则尽量创建MultiIndex
对象
-
-
Index
对象负责管理轴label
和其他元数据(比如轴name
)。构建Series/DataFrame
时,传给index/columns
关键字的任何数组或者序列都将被转化成一个Index
。Index
对象是immutable
,因此用户无法对其进行修改。这样才能够使得Index
对象在多个数据结构之间安全共享 -
存在多种索引类型。
-
Index
:最泛化的Index
对象,将轴label
表示为一个Python
对象组成的Numpy
数组 -
Int64Index
:针对整数的特殊Index
-
MultiIndex
:层次化索引对象,表示单个轴上的多层索引。可以看做由元组组成的数组 -
DatatimeIndex
:存储纳秒级时间戳,用numpy
的datatime64
类型表示 -
PeriodIndex
:针对Period
数据(时间间隔)的特殊Index
-
-
Index
的功能类似一个固定大小的集合。其类似于集合的方法有(因为Index
不可变,因此返回的都是新的Index
对象):-
.copy([name,deep,dtype])
:返回一份Index
的拷贝。 -
.append(other)
:连接另一个Index
对象,产生一个新的Index
对象。注意重复的label
并不会合并 -
.difference(other)
:计算差集,返回一个Index
对象 -
.intersection(other)
:计算交集,返回一个Index
对象 -
.union(other)
:计算并集,返回一个新的Index
对象 -
.isin(values[, level])
:计算Index
中各label
是否在values
中 -
.delete(loc)
:删除下标loc
处的元素,得到新的Index
-
.drop(labels[, errors])
:删除传入的labels
,得到新的Index
-
.insert(loc, item)
:在指定下标位置插入值,得到新的Index
-
.unique()
:返回Index
中唯一值的数组,得到新的Index
-
-
我们可以将
Index
转换成其他数据类型:-
.astype(dtype,[,copy])
:转换成另一个数据类型的Index
,其label
的dtype
被转换成指定的值 -
.tolist()
:转换成列表 -
.to_series(**kwargs)
:转换成Series
,Series
的数据和label
相同
-
-
Index
提供的选取方法有:-
.get_indexer(target[, method, limit, ...])
:获取target
(一个Index
对象)对应的下标列表。-
target
:一个Index
对象。我们要考察的就是Index
中的每个label
在self
中的下标序列。 -
method
:指定label
的匹配方法。可以为None
,表示严格匹配(如果不存在则下标为 -1)。如果为'pad'/'ffill'
,则:若未找到匹配的,则使用前向匹配。如果为'backfill'/'bfill'
,则:若未找到匹配的,则使用后向匹配。如果为'nearest'
,则:若未找到匹配的,则使用最近邻匹配。匹配时,假设你的
Index
的label
是有序排列的(要么是升序,要么是降序) -
limit
:一个整数,指定前向/后向/最近填充时:如果有连续的k
个NaN
,则只填充其中limit
个。 -
tolerance
:一个整数,用于给出在不匹配时,连续采用前向/后向/最近邻匹配的跨度的最大值。
-
-
.get_level_values(level)
:返回指定level
的Index
,用于MultiIndex
。 -
.get_loc(key[, method, tolerance])
:返回指定label
处的下标,由key
指定。其中method
和tolerance
参数见上述。如果method=None
,且key
指定的label
找不到,则抛出异常。 -
.get_value(series, key)
:寻找Series
指定label
处的值。若key
指定的label
找不到,则抛出异常。 -
.slice_locs([start, end, step, kind])
:计算给定start label
和end label
之间的下标序列,返回代表该下标序列的切片或者数组。其中不包括end
。
-
3. MultiIndex
-
MultiIndex
代表的是多级索引对象。它继承自Index
,其中的多级label
采用元组对象来表示。在MultiIndex
内部,并不直接保存元组对象,而是使用多个Index
对象保存索引中每级的label
。 -
class pandas.MultiIndex(levels=None, labels=None, sortorder=None, names=None,
copy=False, verify_integrity=True, _set_identity=True, name=None, **kwargs)
参数:
-
levels
:一个数组的列表,给出了每一级的level
。 -
labels
:一个数组的列表,给出了每一级level
的下标。第i
级label
是这样产生的:- 首先获取
labels[i]
,它是一个下标序列,代表第 级。 - 假设第
k
位置为整数 3,在第 级第 位的label
就是levels[i][3]
。
- 首先获取
-
sortorder
:一个整数,给出了已经排序好了的level
级别。 -
names
:一个字符串序列,给出了每个Index
的name
。其中每个级别对应一个Index
-
copy
:一个布尔值。如果为True
,则拷贝基础数据 -
verify_integrity
:一个布尔值。如果为True
,则检测各级别的label/level
都是连续的且有效的 -
name
:指定了本MultiIndex
的名字
你也可以通过下面的类方法来创建
MultiIndex
:-
MultiIndex.from_arrays(arrays[, sortorder, ...])
:将二维序列转换为MultiIndex
。其中arrays
为array-like
的序列,每个array-like
按顺序的给出了一列label
(一个级别) -
MultiIndex.from_tuples(tuples[, sortorder, ...])
:将元组序列转换为MultiIndex
。其中tuples
为tuple-like
的序列,每个array-like
按顺序的给出了一行label
对(不同级别的一对) -
MultiIndex.from_product(iterables[, ...])
:根据多个可迭代对象生成一个MultiIndex
,其中使用笛卡尔积的算法。其中iterables
为可迭代对象的序列
你也可以通过传递一个元组列表给
Index()
,并且将tupleize_cols
设置为True
来创建MultiIndex
-
4. DataFrame
-
DataFrame
是一个表格型的数据结构,它含有一组有序的列,每一列都可以是不同的值类型(数值、日期、object
类型)。其中object
类型可以保存任何python
对象,比如字符串。同一列必须是相同的值类型。-
DataFrame
既有行索引,又有列索引。他可以被看作为Series
组成的字典(共用同一个行索引) -
DataFrame
中面向行和面向列的操作基本上是平衡的。其实DataFrame
中的数据是以一个或者多个二维块存放的
-
-
class pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
:-
data
:可以是一个二维数组、字典、或者DataFrame
。 -
index
:一个Index
或者array-like
对象(必须为一维的),它指定了行标签。如果未提供,则使用np.arange(n)
。 -
columns
:一个Index
或者array-like
对象(必须为一维的),它指定了列标签。如果未提供,则使用np.arange(n)
。 -
dtype
:指定数据类型。如果为None
,则数据类型被自动推断 -
copy
:一个布尔值。如果为True
,则拷贝输入数据data
常见的构造
DataFrame
有以下情况:- 二维
ndarray
:data
就是数据,此时可以传入index/columns
参数 - 一个字典,其中字典的值为一维数组、一维列表、一维元组:此时每个键就是列索引,对应的值就是列数据。要求所有序列的长度相同
-
numpy
的结构化数组:类似于由数组组成的字典 -
Series
组成的字典:此时每个键就是列索引,对应的Series
就是列数据。如果没有显式的指定行索引,那么各个Series
的索引将会被合并成DataFrame
的行索引。 - 字典的字典:各个内层字典会成为一列,键会被合并成结果的行索引。跟
Series 组成的字典
情况一致 - 字典或者
Series
的列表:每一项将会成为DataFrame
的一行。字典的键、Series
索引的并集将会成为DataFrame
的列索引 - 列表、元组组成的列表:类似于二维
ndarray
- 另一个
DataFrame
:该DataFrame
的索引将会被沿用,除非显式指定其他索引 -
numpy
的MaskedArray
:类似于二维ndarray
,只是掩码值在结果DataFrame
中会变成NA/缺失值
columns
/index
有两种作用:如果构造的DataFrame
没有索引,则它们分别给索引赋值;如果构造的DataFrame
已有索引,则它们按照指定顺序排列指定的索引。 -
-
可以通过下面的类方法从其他数据结构中创建
DataFrame
:-
DataFrame.from_dict(data, orient='columns', dtype=None)
:从字典中创建DataFrame
。-
data
:是个字典,其格式为:{key:array-like}
或者{key:dict}
。 -
orient
:指定了key
为行还是列。参数的值为'columns'
(key
为列的label
,默认行为);或者'index'
(key
为行的label
) -
dtype
:数据类型。如果为None
,则自动推断。
-
-
DataFrame.from_items(items, columns=None, orient='columns')
:从元组序列中创建DataFrame
。-
items
:为元组序列,元组格式为:(key,value)
,其中value
为表示一维数据的序列或者Series
对象。 -
columns
:一个序列,给出列的labels
。- 当
orient='index'
时必须传入(此时key
指定的是行的label
),且长度不能大于DataFrame
的列数。 - 当
orient='columns
时,key
就是列的label
,此时columns
关键字参数指定的列label
必须等于某个key
;否则抛出异常。
- 当
-
-
orient
:参见.from_dict
的解释。
-
-
你可以将
DataFrame
转换为其他数据类型。-
.to_dict(*args, **kwargs)
方法:转换成字典。参数orient
决定了转换方式。-
orient ='dict'
:字典的形式为:{col_label:{index_label:value}}
(默认行为) -
orient ='list'
:字典的形式为:{col_label:[values]}
-
orient ='series'
:字典的形式为:{col_label:Series(values)}
-
orient ='split'
:字典的形式为:{'index':[index_labels],'columns':[col_labels],'data':[values]}
-
orient ='records'
:字典的形式为:[{col_label:value},...,{col_label:value}]
-
orient ='index'
:字典的形式为:{index_label:{col_label:value}}
- 你可以使用简化字符串,如
's'
代表'series'
,'sp'
代表'split'
-
-
.to_records(index=True, convert_datetime64=True)
方法:转换成结构数组。-
index
:一个布尔值。如果为True
,则结果中包含index
-
convert_datetime64
:一个布尔值,如果为True
,则转换DatetimeIndex
为datetime.datetime
-
-
-
可以将
DateFrame
转换成字符串:to_string(buf=None, columns=None, col_space=None, header=True, index=True,
na_rep='NaN', formatters=None, float_format=None, sparsify=None,
index_names=True, justify=None, line_width=None, max_rows=None,
max_cols=None, show_dimensions=False)
-
buf
:一个StringIO-like
对象,是写入的buffer
-
columns
:一个序列,指定了列标签的一个子集,该子集的数据被输出 -
col_space
:一个整数,指定了每一列的最小宽度 -
header
:一个布尔值。如果为True
,则添加头部信息(column labels
) -
index
:一个布尔值。如果为True
,则添加index labels
-
na_rep
:一个字符串,代表数值NaN
-
float_format
:浮点数的格式化函数(单参数)。应用于浮点列 -
formatters
:一个单参数函数的列表(列表长度等于列数)或者一个单参数函数的字典。- 如果是列表,则根据列号,对应使用格式化函数
- 如果是字典,则根据列
label
,对应使用格式化函数
-
sparsify
:一个布尔值。Set to False for a DataFrame with a hierarchical index to print every multiindex key at each row, default True -
index_names
:一个布尔值。如果为True
,则添加index names
-
justify
:指定column label
的对齐方式。可以为'left'
(左对齐),或者'right'
(右对齐)。默认为None
返回转换后的字符串。
-
二、 内部数据结构
-
Index
的结构如图所示(实线为普通属性,虚线为property
属性或者getset_descriptor
):-
.name
为普通属性,返回Index
的名字 -
.values/._values
为property
属性,返回Index
的内部数据的视图 -
._data
为普通属性,返回Index
的内部数据 -
.shape
为property
属性,返回内部数据的形状 -
._engine
为标签映射管理器,它负责管理label
和下标之间的映射 -
ObjectEngine
对象使用一个哈希表对象PyObjectHashTable
对象(由ObjectEngine
对象的.mmaping
属性给出,该属性是一个getset_descriptor
)将标签映射到其对应的整数下标的。
-
-
MultiIndex
的结构如图所示-
.name
为普通属性,返回MultiIndex
的名字。同Index
-
.values/._values
为property
属性,返回MultiIndex
的内部数据的视图。同Index
._data
为None
,这里是与Index
不同。
-
.shape
为property
属性,返回内部属性的形状 。同Index
-
._engine
为标签映射管理器,它负责管理label
和下标之间的映射。同Index
-
.labels
为property
属性,它返回一个FrozenList
(不可变列表),列表中存储每一级的label
对应的下标(也就是创建MultiIndex
时传入的labels
参数),以FrozenNDArray
的数据类型。 -
.levels
为property
属性,它返回一个FrozenList
(不可变列表),列表中存储每一级的label
(也就是创建MultiIndex
时传入的levels
参数),以Index
的数据类型。
-
-
Seris
的结构如图所示(实线为普通属性,虚线为property
属性或者getset_descriptor
):-
._name
为普通属性,返回Seris
的名字;.name
为property
属性,返回的也是Seris
名字 -
.dtype/.dtypes
为property
属性,返回Series
的数据类型。 -
.ftype/ftypes
为property
属性,返回一个字符串,说明Series
是否稀疏数据。(二者返回的字符串的值相同,但不是同一个字符串对象) -
.values/._values
为property
属性,返回Series
的内部数据的视图 -
.index
为普通属性,返回Series
的索引 -
.shape
为property
属性,返回Series
的数据的形状 -
._data
为普通属性,它返回的是一个SingleBlockManager
对象,该对象负责管理内部数据。 -
SingleBlockManager
的.shape
属性为property
属性,返回内部数据的形状 -
SingleBlockManager
的.blocks
属性为普通属性,返回一个列表,该列表只有一个元素,该元素为一个IntBlock
对象(或者其他的xxxBlock
对象),代表了内部数据。 -
IntBlock
的.values
属性为普通属性,它返回内部数据:一个ndarray
。 -
IntBlock
的.shape
属性为property
属性,它返回内部数据的形状
-
-
DataFrame
的结构如图所示(实线为普通属性,虚线为property
属性或者getset_descriptor
):-
.index/columns
属性都为普通属性,它们返回的都是一个Index
对象,参考Series
。 -
.dtypes
属性为property
属性,给出了每列的数值类型。它返回的是一个Series
。并且没有.dtype
属性,这一点与Series
不同。 -
.ftypes
属性为property
属性,给出了每列是否为sparse/dense
的。它返回的是一个Series
。并且没有.ftype
属性,这一点与Series
不同。 -
.values/._values/.shape
属性都为property
属性,参考Series
。 -
._data
属性为普通属性,它返回的是一个BlockManager
对象,该对象负责管理内部数据。该对象的.block
属性(普通属性)返回一个列表,该列表里面有多个元素。DataFrame
尽量用一个数组保存类型相同的列。 -
每个元素都为一个
xxBlock
对象。如IntBlock/FloatBlock...
- 一个
xxBlock
可能存储多个列的数据(这些列的数据都是同一个类型)
- 一个
-
xxBlock
对象的.values
属性(普通属性)就是存储的某个列(或者某些类型相同的列)的内部数据,一个ndarray
-
xxBlock
对象的.shape
属性(property
属性)就是存储的某个列(或者某些类型相同的列)的内部数据的形状 -
.blocks
属性为property
属性。该属性返回一个字典,该字典的键为不同的数值类型,该字典的值为该数值类型的数值组成的DataFrame
-
三、 下标存取
1. [ ] 操作符
-
对于
Index
对象,可以通过[]
来选取数据,它类似于一维ndarray
的索引。下标可以为下列几种下标对象:-
一个整数下标。此时返回对应的
label
-
一个整数
slice
。此时返回对应的Index
(根据一维labels
先切片,再组装成Index
) -
一个
array-like
对象(元素可以为下标或者布尔值)。此时返回对应的Index
。(根据一维labels
先索引,再组装成Index
) -
由
None
组成的二元组,其中None
相当于新建一个轴。- 如果
None
为第一个元素,则新建的轴为 0 轴; - 如果
None
为第二个元素,则新建的轴为 1 轴。 - 另外
idx[None]
等价于idx[None,:]
,但是idx[None]
返回的是ndarray
。 - 它并没有将
Index
转换成MultiIndex
,只是将Index
内部的数据数组扩充了一个轴
- 如果
Index 的索引只支持整数/整数
slice
/整数序列/布尔序列/整数数组/布尔数组/None 等。 -
-
对于
Series
对象,可以通过[]
来选取数据,它类似于一维ndarray
的索引。下标可以为下列几种下标对象:-
一个整数下标/一个属性(属性名为某个
label
)/字典索引(键为label
):返回对应的数值 -
一个整数切片/一个
label
切片:返回对应的Series
。(根据一维Series
先切片,再组装成Series
)。注意:label
切片同时包含了起始label
和终止label
-
一个整数
array-like
/一个label array-like
/一个布尔ndarray
:返回对应的Series
。(根据一维Series
先索引,再组装成Series
) -
一个二维整数
array-like
/二维label array-like
:返回对应值组成的二维ndarray
注意:
Series
必须使用布尔数组来索引,不支持布尔序列来索引(抛出KeyError
异常)。
-
-
对于
DataFrame
对象,可以通过[]
来选取数据。下标可以为下列几种下标对象:-
一个属性(属性名为某个
column label
)/字典索引(键为column label
):返回对应的列对应的Series
不可以使用单个整数来索引
-
一个整数切片/一个
row label
切片:返回对应的行组成的DataFrame
。注意:label
切片同时包含了起始label
和终止label
-
一个一维
label array-like
:返回对应的列组成的DataFrame
-
一个布尔数组:返回数组中
True
对应的行组成的DataFrame
。 -
一个布尔
DataFrame
:将该布尔DataFrame
中的False
对应的元素设置为NaN
(布尔DataFrame
中没有出现的值为False
)
-
-
Series
对象除了支持使用位置作为下标存取元素之外,还可以使用索引标签来存取元素。这个功能与字典类似,因此它也支持字典的一些方法,如Series.iteritems()
。 -
对于
Series/DataFrame
切片方式的索引,返回的结果与原始对象共享基础数据。对于采用其他方式的索引,返回的结果并不与元素对象共享基础数据。 -
对于
DataFrame
的赋值与列删除:- 将列表或者数组赋值给某个列时,其长度必须跟
DataFrame
的行数匹配。 - 将标量赋值给某个列时,会将标量扩充
- 将
Series
赋值给某个列时,会精确匹配DataFrame
的索引。如果DataFrame
中某个label
在Series
中找不到,则赋值NaN
(空位都将被填上缺失值) - 为不存在的列赋值会创建出一个新列(必须用字典的形式,不能用属性赋值的形式)
- 关键字
del
用于删除列(必须用字典的形式,不能用属性赋值的形式)
- 将列表或者数组赋值给某个列时,其长度必须跟
-
对于
Series
的赋值与删除:- 对于单个索引或者切片索引,要求右侧数值的长度与左侧相等
- 为不存在的
label
赋值会创建出一个新行(必须用字典的形式,不能用属性赋值的形式) - 关键字
del
用于删除行(必须用字典的形式,不能用属性赋值的形式)
-
如果
Series/DataFrame
的索引有重复label
,则数据的选取行为将有所不同:- 如果索引对应多个
label
,则Series
返回一个Sereis
,DataFrame
返回一个DataFrame
- 如果索引对应单个
label
,则Series
返回一个标量值,DataFrame
返回一个Series
你可以通过
Index.is_unique
属性得知索引是否有重复的。- 对于
[]
、字典索引、属性索引或者.loc/.ix
存取器,结论如上所述 - 对于
.at
存取器:如果索引对应单个label
,索引结果正常。如果索引对应多个label
,则Series
返回一个一维ndarray
;DataFrame
则抛出异常。
- 如果索引对应多个
-
对于
Series/DataFrame
,它们可以使用ndarray
的接口。因此可以通过ndarray
的索引规则来索引它们。df=pd.DataFrame(...)
df[:,0] #使用了 ndarray 的索引方式
2. loc/iloc/ix 存取器
-
对于
Series
,.loc[]
的下标对象可以为:- 单个
label
,此时返回对应的值 -
label
的array-like
、label slice
以及布尔array-like
:返回对应值组成的Series
- 单个
-
对于
DataFrame
,.loc[]
的下标对象是一个元组,其中两个元素分别与DataFrame
的两个轴对应。如果下标不是元组,则该下标对应的是第0轴,第一轴为默认值:
。- 每个轴的下标都支持单个
label
、label array-like
、label slice
、布尔array-like
。 - 若获取的是某一列或者某一行,则返回的是
Series
;若返回的是多行或者多列,则返回的是DataFrame
;如果返回的是某个值,则是普通的标量。
- 每个轴的下标都支持单个
-
.iloc[]
和.loc[]
类似,但是.iloc[]
使用整数下标,而不是使用label
。- 注意整数切片不包括最后一个值。
-
.ix[]
存取器综合了.iloc/.loc
:它可以混合使用label
和位置下标- 注意:如果有整数索引,则应该使用
.loc/.iloc
从而避免混淆
- 注意:如果有整数索引,则应该使用
-
Index
对象不能使用loc/iloc/ix
存取器 -
对于
.loc/.iloc/.ix
:如果某轴的索引为array-like
或者布尔array-like
,则返回的结果与原来的对象不再共享基础数据。如果轴的索引全部都是slice
或者单个整数、单个label
,则返回的结果与原来的对象共享基础数据。
3. at/iat 存取器
-
.at
和.iat
分别使用label
和整数下标获取单个值。它类似于.loc/.iloc
,但是.at/.iat
的速度更快- 每个索引只能是单个
label
或者单个整数
- 每个索引只能是单个
-
对于
DataFrame
,.lookup(row_labels, col_labels)
类似于:.loc[row_labels, col_labels]
,但是.lookup
返回的是一维ndarray
。- 要求
row_labels
和col_labels
长度相同。(row_labels[0],col_labels[0]
决定了结果中第一个元素的位置,...(row_labels[i],col_labels[i]
决定了结果中第i+1
个元素的位置,
- 要求
-
DataFrame.get_value(index, col, takeable=False)
等价于.loc[index, col]
,它返回单个值。而Series.get_value(label, takeable=False)
等价于.loc[label]
,它也返回单个值 -
.get(key[, default])
方法与字典的get()
方法的用法相同。对于DataFrame
,key
为col_label
-
.head([n=5])
和.tail([n=5])
返回头部/尾部n
行数据
4. query 方法
-
对于
DataFrame
,当需要根据一定的条件对行进行过滤时,通常可以先创建一个布尔数组,然后使用该数组获取True
对应的行。另一个方案就是采用query(expr, inplace=False, **kwargs)
方法:-
expr
是个运算表达式字符串,如'label1 >3 and label2<5'
- 表达式中的变量名表示对应的列,可以使用
not/and/or
等关键字进行向量布尔运算。该方法会筛选出那些满足条件的行。 - 如果希望在表达式中使用
Python
变量,则在变量名之前使用@
-
inplace
是个布尔值,如果为True
,则原地修改。否则返回一份拷贝。
-
5. 多级索引
-
对于
.loc/.ix/[]
,其下标可以指定多级索引中,每级索引上的标签。- 多级索引轴对应的下标是一个下标元组,该元组中每个元素与索引中每级索引对应
- 如果下标不是元组,则将其转换成长度为 1 的元组
- 如果元组的长度比索引的层数少,则在其后面补充
slice(None)
6. 整数 label
-
label
不一定是字符串,也有可能是整数(如RangeIndex/Int64Index
等)。尤其是当label
是自动生成的时候。- 当你的
label
是整数时,面向整数的下标索引总是面向label
的,而不是面向position
的。因此推荐使用.loc
来基于label
索引,使用.iloc
来基于position
索引。
- 当你的
四、 运算
1. 数值运算
-
当进行数值运算时,
pandas
会按照标签对齐元素:运算符会对标签相同的两个元素进行计算。对于DataFrame
,对齐会同时发生在行和列上。- 当某一方的标签不存在时,默认以
NaN
填充。缺失值会在运算过程中传播。
由于
NaN
是浮点数中的一个特殊值,因此结果的元素类型被转换为float64
- 结果的索引是双方索引的并集。
- 当某一方的标签不存在时,默认以
-
除了支持加减乘除等运算符之外,
pandas
还提供了对应的函数:add/sub/mul/div/mod(other, axis='columns', level=None, fill_value=None)
:-
other
:一个DataFrame/Series
或者一个array-like
,或者一个标量值 -
axis
:指定操作的轴。可以为0/1/'index'/'columns'
。其意义是:操作发生在哪个轴上。 -
fill_value
:指定替换掉NaN
的值。可以为None
(不替换),或者一个浮点值。注意:如果发现两个NaN
相加,则结果仍然还是NaN
,而并不会是两个fill_value
相加。 -
level
:一个整数或者label
,用于多级索引的运算。
全部运算操作函数为:
add,sub,mul,div,truediv,floordiv,mod,pow,radd,rsub,rmul,rdiv,rtruediv,
rfloordiv,rmod,rpow # 这些的参数为 other,axis,level,fill_value
lt,gt,le,ge,ne,eq# 这些的参数为 ohter,axis,level
对于
DataFrame
和Series
的运算,默认会用DataFrame
的每一行与Series
运算。如果你希望使用DataFrame
的每一列与Series
运算,则必须使用二元操作函数,并且指定axis=0
(表示操作匹配的轴)。 -
2. 排序
-
.sort_index()
方法的作用是根据label
排序(而不是对存放的数据排序)。DataFrame/Series.sort_index(axis=0, level=None, ascending=True, inplace=False,
kind='quicksort', na_position='last', sort_remaining=True)
-
axis
:指定沿着那个轴排序。如果为0/'index'
,则对沿着0轴,对行label
排序;如果为1/'columns'
,则沿着 1轴对列label
排序。 -
level
:一个整数、label
、整数列表、label list
或者None
。对于多级索引,它指定在哪一级上排序。 -
ascending
:一个布尔值,如果为True
,则升序排序;如果是False
,则降序排序。 -
inplace
:一个布尔值,如果为True
,则原地修改。如果为False
,则返回排好序的新对象 -
kind
:一个字符串,指定排序算法。可以为'quicksort'/'mergesort'/'heapsort'
。注意只有归并排序是稳定排序的 -
na_position
:一个字符串,值为'first'/'last'
,指示:将NaN
排在最开始还是最末尾。 -
sort_remaining
:一个布尔值。如果为True
,则当多级索引排序中,指定level
的索引排序完毕后,对剩下level
的索引也排序。
-
-
.sort_values()
方法的作用是根据元素值进行排序。DataFrame/Series.sort_values(by, axis=0, ascending=True, inplace=False,
kind='quicksort', na_position='last')
Series.sort_values(axis=0, ascending=True, inplace=False,
kind='quicksort', na_position='last')
-
by
:一个字符串或者字符串的列表,指定希望对那些label
对应的列或者行的元素进行排序。对于DataFrame
,必须指定该参数。而Series
不能指定该参数。-
如果是一个字符串列表,则排在前面的
label
的优先级较高。它指定了用于比较的字段
-
-
axis
:指定沿着那个轴排序。如果为0/'index'
,则沿着0轴排序(此时by
指定列label
,根据该列的各元素大小,重排列各行);如果为1/'columns'
,则沿着 1轴排序(此时by
指定行label
,根据该行的各元素大小,重排列各列)。 -
ascending
:一个布尔值,如果为True
,则升序排序;如果是False
,则降序排序。 -
inplace
:一个布尔值,如果为True
,则原地修改。如果为False
,则返回排好序的新对象 -
kind
:一个字符串,指定排序算法。可以为'quicksort'/'mergesort'/'heapsort'
。注意只有归并排序是稳定排序的 -
na_position
:一个字符串,值为'first'/'last'
,指示:将NaN
排在最开始还是最末尾。
-
-
DataFrame/Series.sortlevel(level=0, axis=0, ascending=True,
inplace=False, sort_remaining=True)
:根据单个level
中的label
对数据进行排列(稳定的)-
axis
:指定沿着那个轴排序。如果为0/'index'
,则沿着0轴排序 ;如果为1/'columns'
,则沿着 1轴排序 -
level
:一个整数,指定多级索引的level
-
ascending
:一个布尔值,如果为True
,则升序排序;如果是False
,则降序排序。 -
inplace
:一个布尔值,如果为True
,则原地修改。如果为False
,则返回排好序的新对象 -
sort_remaining
:一个布尔值。如果为True
,则当多级索引排序中,指定level
的索引排序完毕后,对剩下level
的索引也排序。
-
-
.rank()
方法的作用是在指定轴上计算各数值的排,其中相同数值的排名是相同的。DataFrame/Series.rank(axis=0, method='average', numeric_only=None,
na_option='keep', ascending=True, pct=False)
-
axis
:指定沿着那个轴排名。如果为0/'index'
,则沿着行排名(对列排名);如果为1/'columns'
,则沿着列排名(对行排名)。 -
method
:一个字符串,指定相同的一组数值的排名。假设数值v
一共有N
个。现在轮到对v
排序,设当前可用的排名为k
。-
'average'
:为各个等值平均分配排名,这N
个数的排名都是
-
'min'
:使用可用的最小的排名,这N
个数的排名都是k
-
'max'
:使用可用的最大的排名,这N
各数的排名都是k+N-1
-
'first
:根据元素数据中出现的顺序依次分配排名,即按照它们出现的顺序,其排名分别为k,k+1,...k+N-1
-
'dense
:类似于'min'
,但是排名并不会跳跃。即比v
大的下一个数值排名为k+1
,而不是k+N
-
-
numeric_only
:一个布尔值。如果为True
,则只对float/int/bool
数据排名。仅对DataFrame
有效 -
na_option
:一个字符串,指定对NaN
的处理。可以为:-
'keep'
:保留NaN
在原位置 -
'top'
:如果升序,则NaN
安排最大的排名 -
'bottom'
:如果升序,则NaN
安排最小的排名
-
-
ascending
:一个布尔值,如果为True
,则升序排名;如果是False
,则降序排名。 -
pct
:一个布尔值。如果为True
,则计算数据的百分位数,而不是排名。
-
3. 统计
-
Series
和DataFrame
对象都支持Numpy
的数组接口,因此可以直接使用Numpy
提供的ufunc
函数对它们进行运算。这些函数通常都有三个常用参数:-
axis
:指定运算沿着哪个轴进行 -
level
:如果轴是多级索引MultiIndex
,则根据level
分组计算 -
skipna
:运算是否自动跳过NaN
下面的方法使用如下的两个
Series
和DataFrame
: -
-
数值运算类方法:(下面的
DataFrame
方法对于Series
也适用)-
DataFrame.abs()
:计算绝对值(只对数值元素进行计算) -
DataFrame.all([axis, bool_only, skipna, level])
:返回指定轴上:是否所有元素都为True
或者非零。bool_only
为True
则仅考虑布尔型的数据。 -
DataFrame.any([axis, bool_only, skipna, level])
:返回指定轴上:是否存在某个元素都为True
或者非零。bool_only
为True
则仅考虑布尔型的数据。 -
DataFrame.clip([lower, upper, axis])
:将指定轴上的数据裁剪到[lower,upper]
这个闭区间之内。超过upper
的值裁剪成upper
;小于lower
的值裁剪成lower
。 -
DataFrame.clip_lower(threshold[, axis])
:返回一份拷贝,该拷贝是在指定轴上:向下裁剪到threshold
-
DataFrame.clip_upper(threshold[, axis])
:返回一份拷贝,该拷贝是在指定轴上:向上裁剪到threshold
-
DataFrame.prod([axis, skipna, level, ...])
:计算指定轴上的乘积 -
DataFrame.sum([axis, skipna, level, ...])
:沿着指定轴,计算样本的和 -
DataFrame.cumsum([axis, skipna])
:计算沿着axis
轴的累积和。 -
DataFrame.cumprod([axis, skipna])
:计算沿着axis
轴的累积乘积。 -
DataFrame.count([axis, level, numeric_only])
:计算沿着axis
轴,level
级索引的非NaN
值的数量。如果numeric_only
为True
,则只考虑数值和布尔类型。对于
Series
,只有level
一个参数。 -
DataFrame.round([decimals])
:对元素指定小数点位数。decimals
可以为一个整数(所有的元素都按照该小数点位数)、一个字典(根据列label
指定)
-
-
最大最小:(下面的
DataFrame
方法对于Series
也适用)-
DataFrame.max([axis, skipna, level, ...])
: 沿着指定轴,计算最大值 -
DataFrame.min([axis, skipna, level, ...])
: 沿着指定轴,计算最小值 -
Series.argmax([axis, skipna, ...])
: 计算最大值的索引位置(一个整数值)pandas 0.20 以后,它返回的不再是索引位置,而是索引 label,等价于 idxmax
-
Series.argmin([axis, skipna, ...])
: 计算最小值的索引位置(一个整数值)pandas 0.20 以后,它返回的不再是索引位置,而是索引 label,等价于 idxmin
-
Series.idxmax([axis, skipna, ...])
: 计算最大值的索引label
-
Series.idxmin([axis, skipna, ...])
: 计算最小值的索引label
-
DataFrame.cummax([axis, skipna])
:计算沿着axis
轴的累积最大值。 -
DataFrame.cummin([axis, skipna])
:计算沿着axis
轴的累积最最小值。 -
DataFrame.quantile([q, axis, numeric_only, ...])
:计算指定轴上样本的百分位数。q
为一个浮点数或者一个array-like
。每个元素都是0~1
之间。如 0.5代表 50%分位 -
DataFrame.rank([axis, method, numeric_only, ...])
:计算指定轴上的排名。 -
DataFrame.pct_change([periods, fill_method, ...])
:计算百分比变化。periods
为相隔多少个周期。它计算的是:(s[i+periods]-s[i])/s[i]
,注意结果并没有乘以 100。 -
Series.nlargest( *args,**kwargs)
:计算最大的N
个数。参数为:-
n
:最大的多少个数 -
keep
:遇到重复值时怎么处理。可以为:'first'/'last'
。
-
-
Series.nsmallest( *args,**kwargs)
:计算最小的N
个数。参数同上。
-
-
统计类方法:(下面的
DataFrame
方法对于Series
也适用)-
DataFrame.mean([axis, skipna, level, ...])
:沿着指定轴,计算平均值 -
DataFrame.median([axis, skipna, level, ...])
:沿着指定轴,计算位于中间大小的数 -
DataFrame.var([axis, skipna, level, ddof, ...])
:沿着指定轴,计算样本的方差 -
DataFrame.std([axis, skipna, level, ddof, ...])
:沿着指定轴,计算样本的标准差 -
DataFrame.mad([axis, skipna, level])
:沿着指定轴,根据平均值计算平均绝对离差 -
DataFrame.diff([periods, axis])
:沿着指定轴的一阶差分。periods
为间隔。 -
DataFrame.skew([axis, skipna, level, ...])
:沿着指定轴计算样本的偏度(二阶矩) -
DataFrame.kurt([axis, skipna, level, ...])
:沿着指定轴,计算样本的峰度(四阶矩)- 对随机变量 , 若存在,则称它为 的 阶原点矩,简称 阶矩。若 存在,则称它为 的 阶中心矩。
-
DataFrame.describe([percentiles, include, ...])
:获取顺序统计量以及其他的统计结果。-
percentiles
:一个array-like
。每个元素都是0~1
之间。如 0.5代表 50%分位 -
include,exclude
:指定包含/不包含哪些列(通过dtype
来指定)。可以为None/'all'
,或者一个dtype
列表
-
-
DataFrame.corr([method, min_periods])
:计算任意两个列之间的非NAN
的、按照索引对齐的值的相关系数。method
为相关系数的类型,可以为:-
'pearson'
:标准的相关系数 -
'kendall'
:Kendall Tau
相关系数 -
'spearman'
:Spearman rank
相关系数
而
min_periods
:一个整数。它指定为了生成一个有效的相关系数,每一对列数据的最短长度。 -
-
DataFrame.corrwith(other[, axis, drop])
:计算两个DataFrame
的行-行、列-列的相关系数。-
axis
:如果为0/'index'
则沿着0轴,则计算列-列之间的相关系数。如果为1/'columns'
,则沿着1轴,计算行-行之间的相关系数 -
drop
:一个布尔值。如果为True
,则如果某行/列都是NaN
,则抛弃该行/列。如果为False
,则返回全部。
-
-
DataFrame.cov([min_periods])
:计算任意两列之间的协方差。min_periods
指定为了生成一个有效的协方差,每一对列数据的最短长度。- 对于
Series
,其调用为:Series.cov(other,[min_periods])
- 对于
-
-
对于
Series
:唯一值、值计数、成员资格:-
Series.unique()
:返回Series
中唯一值组成的一维ndarray
-
Series.value_counts(normalize=False, sort=True, ascending=False,
bins=None, dropna=True)
:对Series
中的数进行计数。如果normalize
为True
,则返回频率而不是频数。sort
为True
则结果根据出现的值排序,排序方式由ascending
指定。-
bins
是一个整数或者None
。如果它为整数,则使用半开半闭区间来统计,它给出了该区间的数量。
-
-
Series.isin(values)
:返回一个布尔数组,给出Series
中各值是否位于values
中。DataFrame
也有此方法。
-
-
对于多级索引,可以通过
level
参数来指定在某个轴上的操作索引级别。如果level=None
,则不考虑索引的多级。
五、变换
1. 索引和轴的变换
-
重新索引:
Series/DataFrame.reindex(index=None, **kwargs)
:-
index
:一个array-like
对象,给出了新的index
的label
-
method
:当新的label
的值缺失时,如何处理。参数值可以为:-
None
:不做任何处理,缺失地方填充NaN
-
'backfill'/'bfill'
:用下一个可用的值填充该空缺(后向填充) -
'pad'/'ffill'
:用上一个可用的值填充该空缺(前向填充) -
'nearest'
:用最近的可用值填充该空缺
-
-
copy
:一个布尔值,如果为True
,则返回一个新的Series
对象(即使传入的index
与原来的index
相同) -
level
:一个整数或者name
,在MultiIndex
的指定级别上匹配简单索引 -
fill_value
:一个标量。指定缺失值的填充数据,默认为NaN
(如果该参数与method
同时出现,则以method
为主) -
limit
:一个整数,指定前向/后向填充时:如果有连续的k
个NaN
,则只填充其中limit
个。它与method
配合 -
tolerance
:一个整数,用于给出在不匹配时,连续采用前向/后向/最近邻匹配的跨度的最大值。它与method
配合
对于
DataFrame
,多了关键字参数:-
columns
:一个array-like
对象,给出了新的columns
的label
对于
DataFrame
,如果.reindex()
只传入一个序列,则默认会重索引行label
。如果同时重索引行label
和列label
,则method
插值只能按照行来进行(即 0 轴) -
-
将列数据变成行索引(只对
DataFrame
有效,因为Series
没有列索引),其中:col label
变成index name
,列数据变成行label
:DataFrame.set_index(keys, drop=True, append=False, inplace=False,
verify_integrity=False)
-
keys
: 指定了一个或者一列的column label
。这些列将会转换为行index
-
drop
:一个布尔值。如果为True
,则keys
对应的列会被删除;否则这些列仍然被保留 -
append
:一个布尔值。如果为True
,则原有的行索引将保留(此时一定是个多级索引);否则抛弃原来的行索引。 -
inplace
:一个布尔值。如果为True
,则原地修改并且返回None
-
verify_integrity
:一个布尔值。如果为True
,则检查新的index
是否有重复值。否则会推迟到检测过程到必须检测的时候。
-
-
reset_index
会将层次化的行index
转移到列中,成为新的一列。同时index
变成一个整数型的,从0开始编号:DataFrame.reset_index(level=None, drop=False, inplace=False,
col_level=0, col_fill='')
Series.reset_index(level=None, drop=False, name=None, inplace=False)
-
level
:一个整数、str
、元组或者列表。它指定了将从层次化的index
中移除的level
。如果为None
,则移除所有的level
-
drop
:一个布尔值。如果为True
,则并不会插入新的列。如果为False
,则插入新的列(由index
,组成,其列名为'index'
)。 -
inplace
:一个布尔值。如果为True
,则原地修改并且返回None
-
col_level
:如果列索引也是多层次的,则决定插入到列索引的哪个level
。 -
col_fill
:如果列索引也是多层次的,则决定插入之后其他level
的索引如何命名的。默认情况下就是重复该index name
对于
Series
,name
就是插入后,对应的列label
-
-
丢弃某条轴上的一个或者多个
label
:Series/DataFrame.drop(labels[, axis, level, inplace, errors])
:-
labels
:单个label
或者一个label
序列,代表要被丢弃的label
-
axis
:一个整数,或者轴的名字。默认为 0 轴 -
level
:一个整数或者level
名字,用于MultiIndex
。因为可能在多个level
上都有同名的label
。 -
inplace
:一个布尔值。如果为True
,则原地修改并且返回None
-
errors
:可以为'ignore'/'raise'
-
-
DataFrame
的.T
方法会对DataFrame
进行转置,使得行与列互换(行索引与列索引也互换) -
交换两个轴:
DataFrame/Series.swapaxes(axis1, axis2, copy=True)
-
交换多级索引的两个
level
:DataFrame/Series.swaplevel(i=-2, j=-1, axis=0, copy=True)
-
i/j
为两个level
的整数position
,也可以是name
字符串。
-
-
想修改轴
label
有两种方案:-
可以采用
Index.map(mapper)
方法。其中mapper
是个可调用对象,它对每个label
进行调用然后返回新的label
。该函数返回一个新的Index
对象。然后将其赋值给pandas
对象的.index/.columns
属性。 -
调用
.rename
方法:Series.rename(index=None, **kwargs)
DataFrame.rename(index=None, columns=None, **kwargs)
-
index/columns
:一个标量、dict-like
、或者一个函数。- 标量:修改了
Series.name
属性。但是对于DataFrame
会抛出异常 -
dict-like
或者函数:应用于对应轴的label
上
- 标量:修改了
-
copy
:如果为True
,则拷贝底层数据(此时inplace=False
) -
inplace
:一个布尔值。如果为True
,则原地修改,此时忽略copy
参数。否则新创建对象。
-
-
2. 合并数据
-
对于
DataFrame
,merge()
方法可以根据一个或者多个键将不同DataFrame
的行连接接起来。它实现的就是数据库的连接操作。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)
-
right
:另一个DataFrame
对象 -
how
:指定连接类型。可以为:-
'left'
:左连接。只使用左边DataFrame
的连接键 -
'right'
:右连接。只使用右边DataFrame
的连接键 -
'outer'
:外连接。使用两个DataFrame
的连接键的并集 -
'inner'
:内连接。使用两个DataFrame
的连接键的交集
-
-
on
:一个label
或者label list
。它指定用作连接键的列的label
。并且必须在两个DataFrame
中这些label
都存在。如果它为None
,则默认使用两个DataFrame
的列label
的交集。你可以通过left_on/right_on
分别指定两侧DataFrame
对齐的连接键。 -
left_on
:一个label
或者label list
。指定左边DataFrame
用作连接键的列,参考on
-
right_on
:一个label
或者label list
。指定右边DataFrame
用作连接键的列,参考on
-
left_index
:一个布尔值。如果为True
,则使用左边的DataFrame
的行的index value
来作为连接键来合并 -
right_index
:一个布尔值。如果为True
,则使用右边的DataFrame
的行的index value
来作为连接键来合并 -
sort
:一个布尔值。如果为True
,则在结果中,对合并采用的连接键进行排序 -
suffixes
:一个二元序列。对于结果中同名的列,它会添加前缀来指示它们来自哪个DataFrame
-
copy
:一个布尔值。如果为True
,则拷贝基础数据。否则不拷贝数据 -
indicator
:一个字符串或者布尔值。- 如果为
True
,则结果中多了一列称作_merge
,该列给出了每一行来自于那个DataFrame
- 如果为字符串,则结果中多了一列(该列名字由
indicator
字符串给出),该列给出了每一行来自于那个DataFrame
- 如果为
说明:
- 如果合并的序列来自于行的
index value
,则使用left_index
或者right_index
参数。如果是使用了left_index=True
,则必须使用right_index=True
,或者指定right_on
。此时right_on
为第二个DataFrame
的行label
。此时所有对键的操作都针对index label
,而不再是column label
。 - 如果不显示指定连接的键,则默认使用两个
DataFrame
的column label
的交集中的第一个label
。 - 如果根据列来连接,则结果的
index label
是RangeIndex
(连续整数)。如果根据行label value
连接,则结果的index label/column label
来自两个DataFrame
- 对于层次化索引的数据,你必须以列表的形式指明用作合并键的多个列。
-
-
函数
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)
作用与left.merge(right)
相同。 -
如果所有的连接键来自于某列值,则可以使用
DataFrame.join()
函数。它是.merge()
的简化版。DataFrame.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False)
-
other
:一个DataFrame
,或者一个Series
(要求它的name
非空),或者一个DataFrame
序列。Series
的name
作用等同DataFrame
的column label
-
on
:指定以调用者的那个column
对应的列为键。 -
how
:参考merge
的how
-
lsuffic/rsuffix
:参考merge
的suffixes
。如果结果中有重名的列,则必须指定它们之一。 -
sort
:一个布尔值。如果为True
,则在结果中,对合并采用的连接键进行排序
如果是
Series
,则连接键为Series
的index value
。此外,DataFrame
默认使用index value
(这与merge()
不同)。 -
-
pandas.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
keys=None, levels=None, names=None, verify_integrity=False, copy=True)
函数:它将多个DataFrame/Series
对象拼接起来。-
objs
:一个序列,序列元素为Series/DataFrame/Panel
等。你也可以传入一个字典,此时字典的键将作为keys
参数。 -
axis
:指定拼接沿着哪个轴。可以为0/'index'/
,表示沿着 0 轴拼接。可以为1/'columns'
,表示沿着 1轴拼接。 -
join
:可以为'inner'/'outer'
,指定如何处理其他轴上的索引。即:其他轴上的 col 如何拼接
-
join_axes
:一个Index
对象的列表。你可以指定拼接结果中,其他轴上的索引而不是交集或者并集(join
参数使用时,其他轴的索引是计算得出的)。 -
verify_integrity
:一个布尔值。如果为True
,则检查新连接的轴上是否有重复索引,如果有则抛出异常。 -
keys
:一个序列。它用于区分拼接结果中,这些行/列来分别来自哪里。在必要的时候将建立多级索引,keys
作为最外层的索引。如果objs
是个字典,则使用字典的键作为keys
。它用于建立拼接结果的 index
-
levels
:一个序列。与keys
配合使用,指定多级索引各级别上的索引。如果为空,则从keys
参数中推断。(推荐为空) -
names
:一个序列。与keys
配合使用,用于建立多级索引的names
。 -
ignore_index
:一个布尔值。如果为True
,则不使用拼接轴上的index value
,代替以RangeIndex
,取值为0,1,...
-
copy
:一个布尔值。如果为True
,则拷贝数据。
-
-
Series/DataFrame.combine_first()
也是一种合并方式。它用参数对象中的数据给调用者打补丁。Series.combine_first(other)
DataFrame.combine_first(other)
-
other
:Series
中必须为另一个Series
,DataFrame
中必须为另一个DataFrame
结果的
index/columns
是两个的并集。结果中每个元素值这样产生:- 如果调用者不是
NaN
,则选择调用者的值 - 如果调用者是
NaN
,则选择参数的值(此时无论参数的值是否NaN
)
-
-
Series/DataFrame.combine()
也是一种合并。Series.combine(other, func, fill_value=nan)
DataFrame.combine(other, func, fill_value=None, overwrite=True)
-
other
:Series
中必须为另一个Series
,DataFrame
中必须为另一个DataFrame
-
func
:一个函数,该函数拥有两个位置参数。第一个参数来自于调用者,第二个参数来自于other
。- 对于
Series
,两个参数都是标量值,对应它们对齐后的元素值。返回值就是结果对应位置处的值。 - 对于
DataFrame
,这两个参数都是Series
,即对应的列。
- 对于
-
fill_value
:一个标量 。在合并之前先用它来填充NaN
。 -
overwrite
:如果为True
,则原地修改调用者。如果为False
,则返回一个新建的对象。
对于
Series
,结果的index
是两个的并集。结果中每个元素值这样产生:- 将两个
Series
在同一个index
的两个标量值分别传给func
-
func
的返回值就是结果Series
在该index
处的值
对于
DataFrame
,结果的index/columns
是两个的并集。结果中每列这样产生:- 将两个
DataFrame
在同一个column label
的两列值分别传给func
-
func
的返回值就是结果DataFrame
在该column label
列的值
-
3. 索引旋转
-
DataFrame.stack()
方法将数据的列索引旋转为行索引。注意:它跟转置不同,转置会同时旋转数据。DataFrame.stack(level=-1, dropna=True)
-
level
:一个整数、字符串或者整数字符串的列表。如果列索引为多级索引,它指定了将哪个级别的索引旋转为行索引 -
dropna
:一个布尔值。如果为True
,则如果结果中某行全为NaN
,则抛弃该行。
与
DataFrame.stack()
对应的就是DataFrame.unstack()
方法。它将数据的行索引转换为列索引。注意:它跟转置不同,转置会同时旋转数据。DataFrame.unstack(level=-1, fill_value=None)
-
level
:一个整数、字符串或者整数字符串的列表。如果行索引为多级索引,它指定了将哪个级别的索引旋转为列索引 -
fill_value
:一个标量。如果结果中有NaN
,则使用fill_value
替换。
旋转时,比如列索引旋转为行索引,则新的行索引是个多级索引,最内层的一级就是原来的列索引。
-
-
DataFrame.pivot()
方法重排数据。它是一个快捷方式,它使用set_index
将列数据变成行索引,然后使用unstack
将行索引转为列索引。DataFrame.pivot(index=None, columns=None, values=None)
-
index
:一个字符串。指定了一个column name
,用该列数据来set_index
(将该列数据变成行索引,删除了原来的旧的行索引)。如果为None
,则不执行set_index
-
columns
:一个字符串,指定了哪个列数据作为结果的columns labels
。实际上对 index,clumns 指定的列数据均 set_index,然后仅对 columns 对应的列数据 unstack
-
values
:一个字符串,指定了哪个列数据作为结果的数据。如果未提供,则剩余的所有列都将作为结果的数据。
-