Pandas
的两个主要数据结构: Series
和DateFrame
创建: 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
,则转换全部。返回转换后的字符串。
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
。
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
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
转换成字符串:
xxxxxxxxxx
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
对于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
的索引规则来索引它们。
xxxxxxxxxx
df=pd.DataFrame(...)
df[:,0] #使用了 ndarray 的索引方式
对于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
,则返回的结果与原来的对象共享基础数据。
.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
行数据
对于DataFrame
,当需要根据一定的条件对行进行过滤时,通常可以先创建一个布尔数组,然后使用该数组获取True
对应的行。另一个方案就是采用query(expr, inplace=False, **kwargs)
方法:
expr
是个运算表达式字符串,如'label1 >3 and label2<5'
not/and/or
等关键字进行向量布尔运算。该方法会筛选出那些满足条件的行。Python
变量,则在变量名之前使用@
inplace
是个布尔值,如果为True
,则原地修改。否则返回一份拷贝。
对于.loc/.ix/[]
,其下标可以指定多级索引中,每级索引上的标签。
slice(None)
label
不一定是字符串,也有可能是整数(如RangeIndex/Int64Index
等)。尤其是当label
是自动生成的时候。
label
是整数时,面向整数的下标索引总是面向label
的,而不是面向position
的。因此推荐使用.loc
来基于label
索引,使用.iloc
来基于position
索引。
当进行数值运算时,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
,用于多级索引的运算。全部运算操作函数为:
xxxxxxxxxx
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
(表示操作匹配的轴)。
.sort_index()
方法的作用是根据label
排序(而不是对存放的数据排序)。
xxxxxxxxxx
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()
方法的作用是根据元素值进行排序。
xxxxxxxxxx
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()
方法的作用是在指定轴上计算各数值的排,其中相同数值的排名是相同的。
xxxxxxxxxx
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
,则计算数据的百分位数,而不是排名。
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
,则不考虑索引的多级。
重新索引: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
:
xxxxxxxxxx
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开始编号:
xxxxxxxxxx
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
方法:
xxxxxxxxxx
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
参数。否则新创建对象。
对于DataFrame
,merge()
方法可以根据一个或者多个键将不同DataFrame
的行连接接起来。它实现的就是数据库的连接操作。
xxxxxxxxxx
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()
的简化版。
xxxxxxxxxx
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()
也是一种合并方式。它用参数对象中的数据给调用者打补丁。
xxxxxxxxxx
Series.combine_first(other)
DataFrame.combine_first(other)
other
:Series
中必须为另一个Series
,DataFrame
中必须为另一个DataFrame
结果的index/columns
是两个的并集。结果中每个元素值这样产生:
NaN
,则选择调用者的值NaN
,则选择参数的值(此时无论参数的值是否NaN
)
Series/DataFrame.combine()
也是一种合并。
xxxxxxxxxx
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
列的值
DataFrame.stack()
方法将数据的列索引旋转为行索引。注意:它跟转置不同,转置会同时旋转数据。
xxxxxxxxxx
DataFrame.stack(level=-1, dropna=True)
level
:一个整数、字符串或者整数字符串的列表。如果列索引为多级索引,它指定了将哪个级别的索引旋转为行索引dropna
:一个布尔值。如果为True
,则如果结果中某行全为NaN
,则抛弃该行。与DataFrame.stack()
对应的就是DataFrame.unstack()
方法。它将数据的行索引转换为列索引。注意:它跟转置不同,转置会同时旋转数据。
xxxxxxxxxx
DataFrame.unstack(level=-1, fill_value=None)
level
:一个整数、字符串或者整数字符串的列表。如果行索引为多级索引,它指定了将哪个级别的索引旋转为列索引fill_value
:一个标量。如果结果中有NaN
,则使用fill_value
替换。旋转时,比如列索引旋转为行索引,则新的行索引是个多级索引,最内层的一级就是原来的列索引。
DataFrame.pivot()
方法重排数据。它是一个快捷方式,它使用set_index
将列数据变成行索引,然后使用unstack
将行索引转为列索引。
xxxxxxxxxx
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
:一个字符串,指定了哪个列数据作为结果的数据。如果未提供,则剩余的所有列都将作为结果的数据。
Series/DataFrame.duplicated(*args, **kwargs)
:返回一个布尔Series
,指示调用者中,哪些行是重复的(重复行标记为True
)。
keep
:一个字符串或者False
,指示如何标记。它代替了废弃的参数take_last
'first'
:对于重复数据,第一次出现时标记为False
,后面出现时标记为True
'last'
:对于重复数据,最后一次出现时标记为False
,前面出现时标记为True
False
:对于重复数据,所有出现的地方都标记为True
而Series/DataFrame.drop_duplicates(*args, **kwargs)
:返回重复行被移除之后的Series/DataFrame
。
keep
:一个字符串或者False
,指示如何删除。 它代替了废弃的参数take_last
'first'
:对于重复数据,保留第一次出现,后面出现时删除'last'
:对于重复数据,最后一次出现时保留,前面出现时删除False
:对于重复数据,删除所有出现的位置inplace
:一个布尔值。如果为True
,则原地修改。否则返回新建的对象。
对于DataFrame
,还有个 subset
参数。它是column label
或者其列表,给出了考虑哪些列的重复值。默认考虑所有列。(即一行中哪些字段需要被考虑)
你可以使用numpy
的ufunc
函数操作pandas
对象。
有时,你希望将函数应用到由各列或者各行形成的一维数组上,此时DataFrame
的.apply()
方法即可实现此功能。
.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)
func
:一个可调用对象,它会应用于每一行或者每一列axis
:指定应用于行还是列。如果为0/'index'
,则沿着0轴计算(应用于每一列);如果为1/'columns'
,则沿着1轴计算(应用于每一行)。broadcast
:一个布尔值,如果为True
,则结果为DataFrame
(不足的部分通过广播来填充)raw
:一个布尔值。如果为False
,则转换每一行/每一列为一个Series
,然后传给 func
作为参数。如果True
,则func
接受到的是ndarray
,而不是Series
reduce
:一个布尔值。用于判断当DataFrame
为空时,应该返回一个Series
还是返回一个DataFrame
。如果为True
,则结果为Series
;如果为False
,则结果为DataFrame
。args
:传递给func
的额外的位置参数(第一个位置参数始终为Series/ndarray
)
有时,你希望将函数应用到DataFrame
中的每个元素,则可以使用.applymap(func)
方法。之所以不叫map
,是因为Series
已经有个.map
方法。
Series
的.apply()
方法应用到Series
的每个元素上:
.apply(func, convert_dtype=True, args=(), **kwds)
func
:一个可调用对象,它会应用于每个元素convert_dtype
:一个布尔值。如果为True
,则pandas
会自动匹配func
结果的最佳dtype
;如果为False
,则dtype=object
args
:传递给func
的额外的位置参数。kwds
:传递给func
的额外的关键字参数。返回结果可能是Series
,也可能是DataFrame
(比如,func
返回一个Series
)
Series
的.map(arg,na_action=None)
方法会应用到Series
的每个元素上:
arg
:一个函数、字典或者Series
。如果为字典或者Series
,则它是一种映射关系,键/index label
就是自变量,值就是返回值。na_action
:如果为ignore
,则忽略NaN
返回相同index
的一个Series
pands
对象上的所有描述统计都排除了缺失数据。
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
:根据各label
的值中是否存在缺失数据来对轴label
进行过滤。
axis
:指定沿着哪个轴进行过滤。如果为0/'index'
,则沿着0轴;如果为1/'columns'
,则沿着1轴。你也可以同时提供两个轴(以列表或者元组的形式)how
:指定过滤方式。如果为'any'
,则如果该label
对应的数据中只要有任何NaN
,则抛弃该label
;如果为'all'
,则如果该label
对应的数据中必须全部为NaN
才抛弃该label
。thresh
:一个整数,要求该label
必须有thresh
个非NaN
才保留下来。它比how
的优先级较高。subset
:一个label
的array-like
。比如axis=0
,则subset
为轴 1 上的标签,它指定你考虑哪些列的子集上的NaN
inplace
:一个布尔值。如果为True
,则原地修改。否则返回一个新创建的DataFrame
对于Series
,其签名为: Series.dropna(axis=0, inplace=False, **kwargs)
DataFrame/Series.fillna(value=None, method=None, axis=None, inplace=False, limit=None,
downcast=None, **kwargs)
:用指定值或者插值方法来填充缺失数据。
value
:一个标量、字典、Series
或者DataFrame
。注意:value
与method
只能指定其中之一,不能同时提供。
NaN
的数据。Series/dict
,则它指定了填充每个index
的数据DataFrame
,则它指定了填充每个DataFrame
单元的数据method
:指定填充方式。可以为None
,也可以为:
'backfill'/'bfill'
:使用下一个可用的有效值来填充(后向填充)'ffill'/'pad'
:使用前一个可用的有效值来填充(前向填充)axis
:指定沿着哪个轴进行填充。如果为0/'index'
,则沿着0轴;如果为1/'columns'
,则沿着1轴
inplace
:一个布尔值。如果为True
,则原地修改。否则返回一个新创建的DataFrame
limit
:一个整数。如果method
提供了,则当有连续的N
个NaN
时,只有其中的limit
个NaN
会被填充(注意:对于前向填充和后向填充,剩余的空缺的位置不同)
downcast
:一个字典,用于类型转换。字典形式为: {label->dtype}
,dtype
可以为字符串,也可以为np.float64
等。
DataFrame/Series.isnull()
:返回一个同样尺寸的布尔类型的对象,来指示每个值是否是null
DataFrame/Series.notnull()
:返回一个同样尺寸的布尔类型的对象,来指示每个值是否是not null
fillna()
方法可以看作是值替换的一种特殊情况。更通用的是值替换replace()
方法。
xxxxxxxxxx
Series/DataFrame.replace(to_replace=None, value=None, inplace=False, limit=None,
regex=False, method='pad', axis=None)
to_replace
:一个字符串、正则表达式、列表、字典、Series
、数值、None
。指示了需要被替换的那些值
字符串:则只有严格等于该字符串的那些值才被替换
正则表达式:只有匹配该正则表达式的那些值才被替换(regex=True
)
列表:
to_place
和value
都是列表,则它们必须长度严格相等regex=True
,则列表中所有字符串都是正则表达式。字典:字典的键对应了被替换的值,字典的值给出了替换值。如果是嵌套字典,则最外层的键给出了column
名
None
:此时regex
必须是个字符串,该字符串可以表示正则表达式、列表、字典、ndarray
等。如果value
也是None
,则to_replace
必须是个嵌套字典。
value
:一个字符串、正则表达式、列表、字典、Series
、数值、None
。给出了替换值。如果是个字典,则键指出了将填充哪些列(不在其中的那些列将不被填充)
inplace
:一个布尔值。如果为True
,则原地修改。否则创建新对象。
limit
:一个整数,指定了连续填充的最大跨度。
regex
:一个布尔值,或者与to_replace
类型相同。
True
,则to_replace
必须是个字符串。to_replace
必须为None
,因为它会被视作过滤器method
:指定填充类型。可以为'pad'/'ffill'/'bfill'
。当to_replace
是个列表时该参数有效。
interpolate
是通过前后数据插值来填充NaN
。
xxxxxxxxxx
Series/DataFrame.interpolate(method='linear', axis=0, limit=None, inplace=False,
limit_direction='forward', downcast=None, **kwargs)
method
:一个字符串,指定插值的方法。
'linear'
:线性插值。只有它支持MultiIndex
'index'
/'values'
:使用索引标签的整数下标来辅助插值'nearest', 'zero', 'slinear', 'quadratic', 'cubic',
'barycentric', 'polynomial'
使用scipy.interpolate.interp1d
。对于'polynomial'/'spline'
,你需要传入一个order
(一个整数)
'krogh', 'piecewise_polynomial', 'spline', 'pchip','akima'
也使用了scipy
的插值算法。它们使用索引标签的整数下标来辅助插值。'time'
: interpolation works on daily and higher resolution data to interpolate given length of intervalaxis
:指定插值的轴。如果为0/'index'
则沿着0 轴;如果为1/'columns'
则沿着 1 轴
limit
:一个整数,指定插值时,如果有K
个连续的NaN
,则只插值其中的limit
个
limit_direction
:一个字符串。当设定了limit
时,指定处理前面limit
个NaN
,还是后面limit
个NaN
。可以为'forward'/'backward'/'both'
inplace
:一个布尔值。如果为True
,则原地修改。否则创建新对象。
downcast
:指定是否自动向下执行类型转换、
其他参数是传递给scipy
的插值函数的。
连续数据常常会被离散化或者拆分成面元bin
。可以通过pandas.cut()
函数来实现:
xxxxxxxxxx
pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3,
include_lowest=False)
x
:一维的数据。
bins
:一个整数或者一个序列。
x
最小值小0.1%
;最右侧的区间的右侧比x
最大值大0.1%
。bins
的每个划分点。right
:一个布尔值。如果为True
,则区间是左开右闭;否则区间是左闭右开的区间。
labels
:一个array
或者None
。如果为一个array
,则它指定了结果bins
的label
(要求长度与bins
数量相同)。如果为None
,则使用区间来表示。
retbins
:一个布尔值。如果为True
,则返回bins
precision
:一个整数,给出存储和显示bin label
的精度
include_lowest
:一个布尔值。如果为True
,则最左侧bin
的左侧是闭区间
返回的是一个Categorical
对象或者Series
对象。该函数类似于numpy.histogram()
函数。
另外一个划分的函数是:
xxxxxxxxxx
pandas.qcut(x, q, labels=None, retbins=False, precision=3)
q
:一个整数或者序列。
[0,0.25,0.5,0.75,0.1]
。0.25
代表25%
划分点。如果数据不在任何区间内,则标记为NaN
。其他参数与cut
相同。(qcut
没有bins
参数)
通过Series.map()
方法,所有字符串和正则表达式方法都能应用于各个值。但是如果存在NaN
就会报错。为了解决这个问题,pandas
提供了一些能够跳过NaN
值的字符串操作方法。
Series.str
能够将Series
的值当作字符串处理,并且你可以通过Series.str.func
来应用某些函数。其中func
可以为:
Series.str.capitalize()
Series.str.cat([others, sep, na_rep])
Series.str.center(width[, fillchar])
Series.str.contains(pat[, case=True, flags=0, na=nan, regex=True])
Series.str.count(pat[, flags])
Series.str.decode(encoding[, errors])
Series.str.encode(encoding[, errors])
Series.str.endswith(pat[, na])
Series.str.extract(pat[, flags, expand])
Series.str.extractall(pat[, flags])
Series.str.find(sub[, start, end])
Series.str.findall(pat[, flags])
Series.str.get(i)
Series.str.index(sub[, start, end])
Series.str.join(sep)
Series.str.len()
Series.str.ljust(width[, fillchar])
Series.str.lower()
Series.str.lstrip([to_strip])
Series.str.match(pat[, case=True, flags=0, na=nan, as_indexer=False])
Series.str.normalize(form)
Series.str.pad(width[, side, fillchar])
Series.str.partition([pat, expand])
Series.str.repeat(repeats)
Series.str.replace(pat, repl[, n, case, flags])
Series.str.rfind(sub[, start, end])
Series.str.rindex(sub[, start, end])
Series.str.rjust(width[, fillchar])
Series.str.rpartition([pat, expand])
Series.str.rstrip([to_strip])
Series.str.slice([start, stop, step])
Series.str.slice_replace([start, stop, repl])
Series.str.split([pat, n, expand])
Series.str.rsplit([pat, n, expand])
Series.str.startswith(pat[, na])
Series.str.strip([to_strip])
Series.str.swapcase()
Series.str.title()
Series.str.translate(table[, deletechars])
Series.str.upper()
Series.str.wrap(width, **kwargs)
Series.str.zfill(width)
Series.str.isalnum()
Series.str.isalpha()
Series.str.isdigit()
Series.str.isspace()
Series.str.islower()
Series.str.isupper()
Series.str.istitle()
Series.str.isnumeric()
Series.str.isdecimal()
Series.str.get_dummies([sep])
你也可以通过Series.str[:3]
这种索引操作来进行子串截取。或者使用Series.str.get()
方法进行截取。
分组运算的过程为:拆分-应用-合并
Series/DataFrame
等数据根据你提供的一个或者多个键,被拆分为多组分组中有两种数据:源数据(被分组的对象),分组数据(用于划分源数据的)。
.groupby()
方法是分组方法:
xxxxxxxxxx
Series/DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True,
group_keys=True, squeeze=False, **kwargs)
by
:一个mapping function
、list of function
、一个字典、一个序列、一个元组、一个list of column name
。它指定了分组数据。
如果传入了函数,则在每个index value
上调用函数来产生分组数据
如果是Series
或者字典,则根据每个index value
在字典/Series
中的值来产生分组数据
如果是个column label
,则使用该label
抽取出来的一列数据产生分组数据
如果是个column label
的list
,则使用一组column label
抽取出来的多列数据作为分组数据。
如果是个序列,则它直接指定了分组数据。
如果是个序列的序列,则使用这些序列拼接成一个MulitiIndex
,然后根据这个MultiIndex
替换掉index
后,根据label value
来分组。(事实上并没有替换,只是用于说明这个过程)
如果
axis=1
,则index label
替换成column label
axis
:指定沿着哪个轴分组。可以为0/'index'
,表示沿着 0轴。可以为1/'columns'
,表示沿着 1轴
level
:一个整数、level name
或者其序列。如果axis
是个MultiIndex
,则在指定级别上的索引来分组
as_index
:一个布尔值。如果为True
,则将group label
作为输出的index
。如果为False
,则输出是SQL
风格的分组(此时分组的key
作为一列,而不是作为index
)。Series
中,该参数必须为True
。
sort
:一个布尔值。如果为True
,则对分组的键进行排序。
group_keys
:一个布尔值。如果为True
,且调用了函数来决定分组,则添加分组键来区分不同的数据(否则你不知道每一行数据都对应于哪里)
squeeze
:一个布尔值。如果为True
,则尽可能的缩减结果的类型。
该函数返回一个GroupBy
对象。
我们可以使用dtype
来分组,此时by=df.dtypes,axis=1
:
对于由DataFrame
产生的GroupBy
对象,我们可以用一个或者一组列名对其索引。它其实一个语法糖。
如果索引是一个列名,则df.groupby('key1')['data1']
等价于df['data1'].groupby(df['key1'])
如果索引是一个元组和序列,则 df.groupby('key1')[['data1','data2']]
并不等价于 df[['data1','data2']].groupby(df['key1'])
,而是等同于 df.groupby(df['key1'])
[['data1','data2']]
,是因为df[['data1','data2']]
与df['data1','data2']
语义不同。后者表示某个label
是个元组,该元组的值为'data1','data2'
。
GroupBy
对象是一个迭代器对象。迭代结果产生一组二元元组(由分组名和数据块组成)。
dict(list(GroupBy_obj))
将生产一个字典,方便引用
GroupBy.groups
属性返回一个字典: {group name->group labels}
GroupBy.indices
属性返回一个字典:{group name->group indices}
GroupBy
的统计函数有(排除了NaN
):
GroupBy.count()
:计算各分组的非NaN
的数量GroupBy.cumcount([ascending])
:计算累积分组数量GroupBy.first()
:计算每个分组的第一个非NaN
值GroupBy.head([n])
:返回每个分组的前 n
个值GroupBy.last()
:计算每个分组的最后一个非NaN
值GroupBy.max()
:计算每个分组的最大值GroupBy.mean(*args, **kwargs)
:计算每个分组的均值GroupBy.median()
:计算每个分组的中位数GroupBy.min()
:计算每个分组的最小值GroupBy.nth(n[, dropna])
:计算每个分组第n
行数据。 如果n
是个整数列表,则也返回一个列表。GroupBy.ohlc()
:计算每个分组的开始、最高、最低、结束值GroupBy.prod()
:计算每个分组的乘GroupBy.size()
:计算每个分组的大小(包含了NaN
)GroupBy.sem([ddof])
:计算每个分组的sem
(与均值的绝对误差之和)GroupBy.std([ddof])
:计算每个分组的标准差GroupBy.sum()
:计算每个分组的和GroupBy.var([ddof])
:计算每个分组的方差GroupBy.tail([n])
:返回每个分组的尾部 n
个值另外SeriesGroupBy/DataFrameGroupBy
也支持Series/DataFrame
的统计类方法以及其他方法:
xxxxxxxxxx
#SeriesGroupBy - DataFrameGroupBy 都有的方法:
.agg(arg, *args, **kwargs)
.all([axis, bool_only, ...])
.any([axis, bool_only, ...])
.bfill([limit])
.corr([method, min_periods])
.count()
.cov([min_periods])
.cummax([axis, skipna])
.cummin([axis, skipna])
.cumprod([axis])
.cumsum([axis])
.describe([percentiles, ...])
.diff([periods, axis])
.ffill([limit])
.fillna([value, method, ...])
.hist(data[, column, by, ...])
.idxmax([axis, skipna])
.idxmin([axis, skipna])
.mad([axis, skipna, level])
.pct_change([periods, ...])
.plot
.quantile([q, axis, ...])
.rank([axis, method, ...])
.resample(rule, *args, **kwargs)
.shift([periods, freq, axis])
.size()
.skew([axis, skipna, level, ...])
.take(indices[, axis, ...])
.tshift([periods, freq, axis])
#SeriesGroupBy独有的方法
SeriesGroupBy.nlargest(*args, **kwargs)
SeriesGroupBy.nsmallest(*args, **kwargs)
SeriesGroupBy.nunique([dropna])
SeriesGroupBy.unique()
SeriesGroupBy.value_counts([normalize, ...])
#DataFrameGroupBy独有的方法
DataFrameGroupBy.corrwith(other[, axis, drop])
DataFrameGroupBy.boxplot(grouped[, ...])
如果你希望使用自己的聚合函数,只需要将其传入.aggregate(func, *args, **kwargs)
或者.agg()
方法即可。其中func
接受一维数组,返回一个标量值。
GroupBy
的统计函数名以字符串的形式传入。(name,function)
元组的序列。其中name
用作结果列的列名。agg()
传入一个字典。字典的键就是列名,值就是你希望对该列采用的函数。
.get_group(key)
可以获取分组键对应的数据。
key
:不同的分组就是依靠它来区分的GroupBy
的下标操作将获得一个只包含源数据中指定列的新GroupBy
对象
GroupBy
类定义了__getattr__()
方法,当获取GroupBy
中未定义的属性时:
GroupBy[name]
,即获取针对该列的GroupBy
对象.apply(name)
对每个分组调用该方法。agg/aggregate
只是分组级运算其中的一种。它接受一维数组,返回一个标量值。
transform
是另一个分组级运算。它也接受一维数组。只能返回两种结果:要么是一个标量值(该标量值将被广播),或者一个相同大小的结果数组。
transform
xxxxxxxxxx
GroupBy.transform(func, *args, **kwargs)
apply
是另一个分组级运算。它是最一般化的分组级运算。它将待处理的对象拆分成多个片段,然后对各个片段调用传入的函数,最后尝试将各个片段组合到一起。
xxxxxxxxxx
GroupBy.apply(func, *args, **kwargs)
func
:运算函数。其第一个位置参数为待处理对象。其返回值是一个标量值或者pandas
对象。args/kwargs
是传递给func
的额外的位置参数与关键字参数。对于DataFrame
的.groupby
时,传递给func
的第一个参数是DataFrame
;对于Series
的.groupby
,传递给func
的第一个参数是Series
。
pd.cut()/qcut()
函数返回的是Categorical
对象。我们可以用它作为.groupby()
的by
参数的值。这样可以实现桶分析。
透视表pivot table
是一种数据汇总工具。它根据一个或者多个键对数据进行聚合,并根据行和列上的分组键将数据分配到各个单元格中。
.groupby
功能以及索引的变换来手工实现这种功能DataFrame.pivot_table()
方法,以及pandas.pivot_table()
函数都可以实现这种功能
xxxxxxxxxx
pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean',
fill_value=None, margins=False, dropna=True, margins_name='All')
data
:一个DataFrame
对象values
:指定哪些列将被聚合。默认聚合所有的数值列。index
:一个index label
、一个Grouper
、一个数组,或者前面这些类型的一个列表。它指定关于分组的列名或者其他分组键,出现在结果透视表的行columns
:一个column label
、一个Grouper
、一个数组,或者前面这些类型的一个列表。它指定关于分组的列名或者其他分组键,出现在结果透视表的列aggfunc
:一个函数或者函数的列表。默认为numpy.mean
。它作为聚合函数。如果为函数的列表,则结果中会出现多级索引,函数名就是最外层的索引名。fill_value
:一个标量,用于替换NaN
margins
:一个布尔值。如果为True
,则添加行/列的总计。dropna
:一个布尔值。如果为True
,则结果不包含这样的列:该列所有元素都是NaN
margins_name
:一个字符串。当margins=True
时,margin
列的列名。
交叉表cross-tabulation:crosstab
是一种用于计算分组频率的特殊透视表。我们可以使用pivot_table()
函数实现透视表的功能,但是直接使用更方便:
xxxxxxxxxx
pandas.crosstab(index, columns, values=None, rownames=None, colnames=None,
aggfunc=None, margins=False, dropna=True, normalize=False)
index
:一个array-like
、Series
或者前两种的列表。它给出了行的计算频数的数据。
columns
:一个array-like
、Series
或者前两种的列表。它给出了列的计算频数的数据。
values
:一个array-like
,该数据用于聚合。如果出现了values
,则必须提供aggfunc
。
aggfunc
:一个函数对象,是聚合函数。如果出现了aggfunc
,则必须提供values
。
rownames
:一个序列。如果非空,则必须和结果的row index
的level
数量相等
colnames
:一个序列。如果非空,则必须和结果的column index
的level
数量相等
margins
:一个布尔值。如果为True
,则添加行/列的总计。
dropna
:一个布尔值。如果为True
,则结果不包含这样的列:该列所有元素都是NaN
normalize
:一个布尔值、字符串('all'/'index'/'columns'
)、或者整数0/1
。它指定是否进行归一化处理(归一化为频率),否则就是频数。
'all'/True
,则对所有数据进行归一化'index'
:则对每一行归一化'columns'
:则对每一列归一化margins
为True
,则对margins
也归一化。values
的作用是这样的:首先根据index-columns
建立坐标。行坐标来自index
,列坐标来自columns
。在index-columns-values
中,同一个坐标下的values
组成Series
。这个Series
被aggfunc
进行聚合,aggfunc
接受一个Series
,返回一个标量。此时就不再是对坐标点进行计数了,而是对values
进行聚合。
Pandas
提供了表示时间点、时间段、时间间隔等三种与时间有关的类型,以及元素为这些类型的索引对象。pandas
还提供了许多与时间序列相关的函数。Python
中,关于时间、日期处理的库有三个:time
、datetime
、Calendar
。其中:datetime
又有datetime.date/datetime.time/datetime.datetime
三个类pytz
模块的common_timezones
可以获取常用的表示时区的字符串。你可以通过pytz.timezone('timezone_str')
来创建时区对象。
time
模块中,时间有三种表现形式:
Unix
时间戳。指的是从1970
年以来的秒数struct_time
形式:一个命名元组,第一位为年、第二位为月....UTC
时间的struct_time
的形式:类似于上面的,只是为UTC
时间。区别在于:前者是本地时间local time
,后者是UTC
时间查看当前时间的三种表现形式:
Unix
时间戳: time.time()
local struct_time
: time.localtime()
utc struct_time
:time.gmtime()
三种格式之间的转换:
timestamp--->local time
:time.localtime(time_stamp)
timestamp--->utc time
:time.gmtime(time_stamp)
local time--->timestamp
:time.mktime(local_time)
utc time---> timestamp
:calendar.timegm(utc_time)
三种格式的时间转换为字符串:
timestamp
:time.ctime(time_stamp)
local struct_time time/utc struct_time time
:time.asctime(struct_time)
local struct_time time/utc struct_time time
:你也可以使用time.strftime(format_str,struct_time)
来自定义格式化串。其中format_str
为格式化串。字符串转换为struct_time
:time.strptime(time_str,format_str)
。其中format_str
为格式化串。
查看当前时区: time.timezone
。它返回的是距离UTC
时间的距离(单位为秒)(>0,在美洲;<=0,在大多数欧洲,亚洲,非洲)。你无法通过修改它的值来修改时区。time
模块使用的是系统的时区。
datetime
模块中主要包含四个类:
datetime.time
:时间类。只包含时、分、秒、微秒等时间信息datetime.date
:日期类。值包含年月日星期等日期信息datetime.datetime
:日期时间类。包含上述两者的全部信息datetime.timedelta
:日期时间间隔类,用来表示两个datetime
之间的差值。datetime.time
的构造函数为:
xxxxxxxxxx
time([hour[, minute[, second[, microsecond[, tzinfo]]]]])
其中tzinfo
就是时区对象。0<=hour<24
,0<=minute<60
,0<=second<60
,0<=microsecond<1000000
,否则抛出异常。tzinfo
默认为None
属性有:
hour/minute/second/microsecond/tzinfo
方法有:
time.replace([hour[, minute[, second[, microsecond[, tzinfo]]]]])
:替换对应的值,返回一个新的对象time.isoformat()
:返回一个ISO 8601
格式的字符串。time.strftime(format)
:格式化datetime.time
对象time.tzname()
:如果时区为为None
,则返回None
。否则返回时区名称
datetime.date
的构造函数为:
xxxxxxxxxx
datetime.date(year, month, day)
month
取值为[1,12]
;day
取值为[1,num]
,num
取决于指定的年和月有多少天类方法有:date.today()/date.fromtimestamp(timestamp)
属性有:year/month/day
方法有:
date1-date2
、date1+timedelta
、date1-timedelta
、date1<date2
date.replace(year,month,day)
:替换掉对应值,返回新对象date.timetuple()
:返回一个time.struct_time
类型的元组date.weekday()
:返回代表星期几的数字。0
为周日date.isoweekday()
:返回代表星期几的数字。7
为周日 date.isocalendar()
:返回一个元组(ISO year,IOS week num,ISO weekday)
date.isoformat()
:返回一个ISO 8601
格式的字符串。date.ctime()
:等价于time.ctime(time.mktime(d.timetuple()))
date.strftime(format)
:格式化datetime.date
对象datetime.datetime
的构造函数为:
xxxxxxxxxx
datetime.datetime(year, month, day, hour=0, minute=0,
second=0, microsecond=0, tzinfo=None)
类方法有:
datetime.today()
:返回当前的时间日期datetime.now(tz=None)
:返回指定时区当前的时间日期。如果tz=None
,则等价于datetime.today()
datetime.utcnow()
:返回当前的UTC
时间日期datetime.fromtimestamp(timestamp, tz=None)
:根据时间戳,创建指定时区下的时间日期。datetime.utcfromtimestamp(timestamp)
:根据时间戳,创建UTC
下的时间日期。 datetime.combine(date, time)
:从date
和time
对象中创建datetime
datetime.strptime(date_string, format)
:从字符串中创建datetime
属性有:year/month/day/hour/minute/second/microsecond/tzinfo
方法有:
datetime1-datetime2
、datetime1+timedelta
、
datetime1-timedelta
、datetime1<datetime2
datetime.date()
:返回一个date
对象datetime.time()
:返回一个time
对象(该time
的tzinfo=None
)datetime.timetz()
:返回一个time
对象(该time
的tzinfo
为datetime
的tzinfo
)datetime.replace([year[, month[, day[, hour[, minute[, second
[, microsecond[, tzinfo]]]]]]]])
:替换掉指定值,返回新对象datetime.astimezone(tz=None)
:调整时区。如果tz=None
,则默认采用系统时区。注意,调整前后的UTC
时间是相同的。datetime.tzname()
:返回时区名字datetime.timetuple()
:返回一个time.struct_time
这样的命名元组datetime.utctimetuple()
:返回一个time.struct_time
这样的命名元组,注意它是在UTC
时间下的,而不是local time
下的datetime.timestamp()
:返回一个时间戳datetime.weekday()
:返回代表星期几的数字。0
为周日datetime.isoweekday()
:返回代表星期几的数字。7
为周日 datetime.isocalendar()
:返回一个元组(ISO year,IOS week num,ISO weekday)
datetime.isoformat(sep='T')
:返回一个ISO 8601
格式的字符串。datetime.ctime()
:等价于time.ctime(time.mktime(d.timetuple()))
datetime.strftime(format)
:格式化datetime.datetime
对象。注意:不能将tzinfo=None
和tzinfo!=None
的两个datetime
进行运算。
下面是常用的格式化字符串的定义:
'%Y'
:4位数的年'%y'
:2位数的年'%m'
:2位数的月 [01,12]
'%d'
:2位数的日 [01,31]
'%H'
:小时(24小时制)[00,23]
'%I'
:小时(12小时制)[01,12]
'%M'
:2位数的分[00,59]
'%S'
:秒[00,61]
,61
秒用于闰秒'%w'
:用整数表示的星期几[0,6]
,0 表示星期日'%U'
:每年的第几周[00,53]
。星期天表示每周的第一天。每年的第一个星期天之前的那几天被认为是第 0 周'%W'
:每年的第几周[00,53]
。星期一表示每周的第一天。每年的第一个星期一之前的那几天被认为是第 0 周'%z'
:以+HHMM
或者-HHMM
表示的UTC
时区偏移量。如果未指定时区,则返回空字符串。'%F'
:以%Y-%m-%d
简写的形式'%D'
:以%m/%d/%y
简写的形式'%a'
:星期几的简称'%A'
:星期几的全称'%b'
:月份的简称'%B'
:月份的全称'%c'
:完整的日期和时间'%q'
:季度[01,04]
timedelta
代表一段时间。其构造:
xxxxxxxxxx
datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0,
minutes=0, hours=0, weeks=0)
在内部,只存储秒、微秒。其他时间单位都转换为秒和微秒。
实例属性(只读):
days/seconds/microseconds
实例方法:
timedelta.total_seconds()
:返回总秒数。
时间点:Timestamp
对象从Python
的datetime
类继承,它表示时间轴上的一个点。
xxxxxxxxxx
pd.Timestamp(ts_input=<object object at 0x0000000001E8F340>, freq=None, tz=None,
unit=None, year=None, month=None, day=None, hour=None, minute=None,
second=None, microsecond=None, tzinfo=None, offset=None)
参数:
ts_input
:一个datetime-like/str/int/float
,该值将被转换成Timestamp
freq
:一个字符串或者DateOffset
,给出了偏移量tz
:一个字符串或者pytz.timezone
对象,给出了时区unit
:一个字符串。当ts_input
为整数或者浮点数时,给出了转换单位offset
:废弃的,推荐使用freq
datetime.datetime
。它们要么使用位置参数,要么使用关键字参数,但是不能混用属性有:
year/month/day/hour/minute/second/microsecond/nanosecond
,这些属性都为整数tzinfo
:时区信息(默认为None
),它是一个datetime.tzinfo
对象dayofweek/dayofyear/days_in_mounth/freqstr/quarter/weekofyear/...
value
:保存的是UTC
时间戳(自UNIX
纪元1970年1月1日以来的纳秒数),该值在时区转换过程中保持不变类方法有:
combine(date, time)
:通过datetime.date
和datetime.time
创建一个Timestamp
fromtimestamp(ts)
:通过时间戳创建一个Timestamp
now(tz=None)
:创建一个指定时区的当前时间。doday(tz=None)
:创建一个指定时区的当前时间。utcfromtimestamp(ts)
:从时间戳创建一个UTC Timestamp
,其tzinfo=None
utcnow()
:创建一个当前的UTC Timestamp
,其tzinfo=UTC
方法有:
.astimezone(tz)/.tz_convert(tz)
:将一个tz-aware Timestamp
转换时区.isoformat(sep='T')
:返回一个ISO 8601
格式的字符串。.normalize()
:将Timestamp
调整到午夜(保留tzinfo
)replace(**kwds)
:调整对应值,返回一个新对象.to_period(self, freq=None)
:返回一个Period
对象`.tz_localize(self, tz, ambiguous='raise', errors='raise')
:将一个tz-naive Timestamp
,利用tz
转换为一个tz-aware Timestamp
.to_pydatetime(...)
:转换为python datetime
对象.to_datetime64(...)
:转换为numpy.datetime64
对象datetime.date/datetime.datetime
继承而来的方法
默认情况下,pands
中的Timestamp
是tz-naive
,即tz
字段为None
。 Timestamp
提供了方便的时区转换功能。如果tz
非空,则是tz-aware Timestamp
。不同时区的时间可以比较,但是naive Timestamp
和localized Timestamp
无法比较。
Timestamp
的减法,要求两个Timestamp
要么都是同一个时区下,要么都是tz-naive
的。
DateOffset
对象:是一个表示日期偏移对象。Timestamp
加一个日期偏移,结果还是一个Timestamp
对象。其声明为:
xxxxxxxxxx
pd.DateOffset(n=1, normalize=False, **kwds)
通常我们使用的是其子类(它们位于pandas.tseries.offsets
中):
Day
:日历日BusinessDay
:工作日Hour
:小时Minute
:分钟Second
:秒Milli
:毫秒Micro
:微秒MonthEnd
:每月最后一个日历日BusinessMonthEnd
:每月最后一个工作日MonthBegin
:每月第一个日历日BusinessMonthBegin
:每月第一个工作日Week
:每周几 Day(2)
:表示两个工作日。
DateOffset
对象可以加在datetime/Timestamp
对象上。如果是MonthEnd
这种加上Timestamp
,则第一次增量会将原日期向前滚动到符合频率规则的下一个日期。
DateOffset.rollforward(time_stamp)
、DateOffset.rollback(time_stamp)
来显式地将日期向前或者向后滚动利用 str(dt_obj)
函数或者datetime.strftime(format_str)
方法,可以将datetime
对象和Timestamp
对象格式化为字符串。而利用datetime.strptime(dt_str,format_str)
类方法,可以从字符串中创建日期。其中dt_str
为日期字符串,如'2011-11-12'
;format_str
为格式化字符串,如'%Y-%m-%d'
。
datetime.strptime
是对已知格式进行日期解析的最佳方式。dateutil
这个第三方包中的parser.parse(dt_str)
,它几乎可以解析所有的日期表示形式。pandas.to_datetime()
方法可以解析多种不同的日期表示形式,将字符串转换为日期。对于标准日期格式的解析非常快。如果发现无法解析(如不是一个日期),则返回一个NaT
(Not a Time
),它是时间戳数据中的NA
值。Timedelta
对象:表示时间间隔。它等价于datetime.timedelta
类。
xxxxxxxxxx
pd.Timedelta(value=<object object at 0x00000000004BF340>, unit=None, **kwargs)
参数:
value
:一个Timedelta
对象,或者datetime.timedelta
,或者np.timedelta64
、或者一个整数,或者一个字符串。指定了时间间隔unit
:一个字符串,指明了当输入时整数时,其单位。可以为'D'/'h'/'m'/'s'/'ms'/'us'/'ns'
days/seconds/microseconds/nanoseconds
:都是数值。给出了某个时间单位下的时间间隔方法:
to_timedelta64()
:返回一个numpy.timedelta64
类型(按照纳秒的精度)total_seconds()
:返回总的时间间隔,单位秒(精度为纳秒)to_pytimedelta()
:返回一个datetime.timedelta
对象属性:
components
:返回各成分的命名元组days/seconds/microseconds/nanoseconds
:返回各个成分delta
:返回总的时常(纳秒计)一个时间间隔有天数、秒数等等属性。注意:所有的这些值与对应的单位相乘的和,才是总的时间间隔。
两个Timestamp
相减可以得到时间间隔Timedelta
DateOffset
也一定程度上表示时间间隔,但是DateOffset
更侧重于按照某个固定的频率的间隔,比如一天、一个月、一周等。
Period
表示一个标准的时间段(如某年,某月)。时间段的长短由freq
属性决定。
xxxxxxxxxx
pd.Period(value=None, freq=None, ordinal=None, year=None, month=None,
quarter=None, day=None, hour=None, minute=None, second=None)
参数:
value
:一个Period
对象或者字符串(如'4Q2016'
),它表示一个时区段。默认为None
freq
:一个字符串,表示区间长度。可选的值从下面函数获取:pandas.tseries.frequencies._period_code_map.keys()
pandas.tseries.frequencies._period_alias_dictionary()
quarter
表示季度。属性:
day/dayofweek/dayofyear/hour/minute/quarter/second/
year/week/weekday/weekofyear/year
:对应的属性end_time
:区间结束的Timestamp
。start_time
:区间开始的Timestamp
freq
方法:
.asfreq(freq,how)
:转换为其他区间。其中freq
为字符串。how
可以为'E'/'end'
,表示包含区间结束;'S'/'start'
表示包含区间开始。.now(freq)
:返回当期日期对应freq
下的Period
strftime(format)
:给出Period
的格式化字符串表示to_timestamp(freq,how)
:转换为Timestamp
。pands
中的频率是由一个基础频率和一个倍数组成。
'M'
表示每月,'H'
表示每小时。DateOffset
对象与之对应。如pandas.tseries.offsets
中的Hour/Minute
。Hour(4)
表示日期偏移为 4小时。'4H'
。也可以组合多个频率4H30min
有些频率描述的时间点并不是均匀间隔的。如'M'
就取决于每个月的天数。下面是一些常用的基础频率
'D'
:偏移量类型为Day
,为每日历日'B'
:偏移量类型为BusinessDay
,为每工作日'H'
:偏移量类型为Hour
,为每小时'T'
或者'min'
:偏移量类型为Minute
,为每分钟'S'
:偏移量类型为Second
,为每秒'L'
或者'ms'
:偏移量类型为Milli
,为每毫秒'U'
:偏移量类型为Micro
,为每微秒'M'
:偏移量类型为MonthEnd
,为每月最后一个日历日'BM'
:偏移量类型为BusinessMonthEnd
,为每月最后一个工作日'MS'
:偏移量类型为MonthBegin
,为每月第一个日历日'BMS'
:偏移量类型为BusinessMonthBegin
,为每月第一个工作日'W-Mon'...'W-TUE
:偏移量类型为Week
,为指定星期几(MON/TUE/WED/THU/FRI/SAT/SUN
)开始算起,每周 调用Timestamp
对象的.to_period(freq)
方法能将时间点转化为包含该时间点的时间段。
Period
的.asfreq()
方法可以实现时间段的频率转换。
创建Period
时,我们可以传入一个Timestamp
的各分量(由year/month...
等提供)。创建的Period
是包含该时刻,且指定频率。在使用Timestamp.to_period(freq)
也是如此。
给定一个频率的Period
,如果转换到更低频的Period
,则非常简单:返回指定频率下的包含本Period
的那个Period
即可。如果想转换到更高频的Period
,则由于在本Period
下,对应了很多个高频的Period
,则返回哪一个,由how
参数指定:
how=S
:返回最开头的那个Period
how=E
:返回最末尾的那个Period
而Period.to_timestamp(freq,how)
方法中,我们首先进行时间段的频率转换,然后提取该频率的Period
开始处的Timestamp
如果两个Period
对象有相同的频率,则它们的差就是它们之间的单位数量。
DatetimeIndex
是一种索引,它的各个标量值是Timestamp
对象,它用numpy
的datetime64
数据类型以纳秒形式存储时间戳。
xxxxxxxxxx
pd.DatetimeIndex(data=None, freq=None, start=None, end=None, periods=None,
copy=False, name=None, tz=None, verify_integrity=True, normalize=False,
closed=None, ambiguous='raise', dtype=None, **kwargs)
data
:一个array-like
对象,给出了各个时间copy
:一个布尔值,如果为True
则拷贝基础数据freq
:一个字符串或者DateOffset
对象,给出了频率start
:一个datetime-like
,指定了起始时间。如果data=None
,则使用它来生成时间periods
:一个整数(大于0),指定生成多少个时间。如果data=None
,则使用它来生成时间end
:一个datetime-like
,指定了结束时间。如果data=None
且periods=None
,则使用它来生成时间closed
:一个字符串或者None
。用于指示区间的类型。可以为'left'
(左闭右开),'right'
(左开右闭),None
(左闭右闭)tz
: 一个字符串,指定了时区。如果非空,则返回的是localized DatetimeIndex
name
:指定了Index
的名字pandas.date_range()
函数可以生成指定长度的DatetimeIndex
xxxxxxxxxx
pandas.date_range(start=None, end=None, periods=None, freq='D', tz=None,
normalize=False,name=None, closed=None, **kwargs)
各参数意义参考DatetimeIndex
的构造函数。
对于以DatetimeIndex
为索引的Series
,我们可以通过指定Timestamp
切片来截取指定时间区间的数据(也可以是对应的字符串来指定Timestamp
)。注意:这里的Timestamp
可以并不是DatetimeIndex
的key
。
DatetimeIndex
的方法有:(DatetimeIndex
继承自Index
,因此它有Index
的所有方法)
indexer_at_time(time, asof=False)
:返回指定time
的位置indexer_between_time( start_time, end_time, include_start=True,
include_end=True)
:返回指定的两个时间之间的索引的位置normalize()
:将时间调整到午夜to_period( freq=None)
:以指定freq
转换到PeriodIndex
to_perioddelta( freq)
:计算不同索引值的Timedelta
,然后转换成一个TimedeldaIndex
to_pydatetime
/tz_convert
/tz_localize
:对每个时间使用Timestamp
对应的方法任何Timestamp
的属性都可以作用于DatetimeIndex
。
如果将一个Period
序列作为索引,则该索引就是PeriodIndex
类型。其各位置的值为Period
对象。
xxxxxxxxxx
pd.PeriodIndex(data=None, ordinal=None, freq=None, start=None, end=None,
periods=None, copy=False, name=None, tz=None, dtype=None, **kwargs)
data
:一个array-like
对象,给出了各个时间段copy
:一个布尔值,如果为True
则拷贝基础数据freq
:一个字符串或者period
对象,给出了频率start
:一个period-like
,指定了起始时间段。如果data=None
,则使用它来生成时间段periods
:一个整数(大于0),指定生成多少个时间段。如果data=None
,则使用它来生成时间段end
:一个period-like
,指定了结束时间段。如果data=None
且periods=None
,则使用它来生成时间段year/month/quarter/day/hour/minute/second
:一个整数、array
或者Series
。通过它们可以组装出一个Period
序列。tz
: 一个字符串,指定了时区。如果非空,则返回的是localized DatetimeIndex
name
:指定了Index
的名字pandas.period_range()
函数可以生成指定长度的PeriodIndex
xxxxxxxxxx
pd.period_range(start=None, end=None, periods=None, freq='D', name=None)
参数意义参见PeriodIndex
的构造函数。
PeriodIndex
的方法有:(PeriodIndex
继承自Index
,因此它有Index
的所有方法)
asfreq( freq=None, how='E')
:转换成另一种频率的时间段to_timestamp(self, freq=None, how='start')
:转成DatetimeIndex
tz_convert(self, tz)/tz_localize(self, tz, infer_dst=False)
:转成对应时区的DatetimeIndex
任何Period
的属性都可以作用于PeriodIndex
。
Series/DataFrame
有一个shift()
方法用于执行单纯的前移或者后移操作,:
xxxxxxxxxx
Series/DataFrame.shift(periods=1, freq=None, axis=0)
periods
:一个整数(可以为负的),指定移动的数量。对于时间序列,单位由freq
指定。freq
:一个DateOffset/timedelta
或者一个频率字符串。指定移动的单位。注意,如果为PeriodIndex
,则freq
必须和它匹配。axis
:为0/'index'
表示沿着0轴移动;为1/'columns'
表示沿着1轴移动如果为时间序列,则该方法移动并建立一个新的索引,但是Series/DataFrame
的值不变。对于非时间序列,则保持索引不变,而移动Series/DataFrame
的值。
本质上,时间序列和非时间序列都是
index_i-->value_i
转换成index_i+n-->value_i
。只是时间序列截取的都是有效值,非时间序列截取了NaN
而已。
重采样resampling
指的是将时间序列从一个频率转换到另一个频率的处理过程。
bin
的边界。这些bin
将时间序列拆分为多个片段。这些片段都是半开放的,一个数据点只能属于一个片段,所有的片段的并集组成了整个时间帧。在对数据降采样时,只需要考虑两样:bin
,用区间的开头还是结尾fillna/reindex
的一样。Period
进行重采样时,升采样稍微麻烦点,因为你必须决定:哪个高频区间代表原区间。就像asfreq
一样,convention
可以设置为'end'/'start'
有些重采样并不划分到上述两者之中。比如将W-WED
(每周三)转换到W-FRI
(每周五)。另外,由于Period
是时间区间,所以升采样和降采样的规则就比较严格:
Day->Month
,目标频率为每月,原频率为每天。Day->Hour
,目标频率为每小时,原频率为每天。如果不满足这些条件,则会引发异常。
resample
方法:
xxxxxxxxxx
Series/DataFrame.resample(rule, how=None, axis=0, fill_method=None, closed=None,
label=None, convention='start', kind=None, loffset=None, limit=None,
base=0, on=None, level=None)
rule
:一个字符串,指定了重采样的目标频率
axis
:为0/'index'
表示沿着0轴重采样;为1/'columns'
表示沿着1轴重采样
closed
:一个字符串,指定降采样中,各时间段的哪一端是闭合的。如果为'right'
,则是左开右闭区间;如果为'left'
,则是左闭右开区间
label
:在降采样中,如何设置聚合值的标签。可以为'right'/'left'
(面元的右边界或者左边界)。如:9:30~9:35
这5分钟会被标记为9:30
或者9:35
how
:用于产生聚合值的函数名或者数组函数。可以为'mean'/'ohlc'/np.max
等。默认为'mean'
,其他常用的有:'first'/'last'/'median'/'ohlc'/'max'/'min'
。
how
被废弃了,而是采用.resample().mean()
这种方案。
convention
:当重采样时期时,将低频转换到高频所采用的约定。可以为's'/'start'
(用第一个高频)或者'e'/'end'
(用最后一个高频)
loffset
:一个timedelta
,用于调整面元(bin
)标签。如'-1s'
,会将用于将聚合的结果标签调早1秒,从而更容易表示它代表哪个区间。比如12:00:00
你就难以判别是哪个区间,而11:59:59
就很容易知道它是那个区间。
你也可以对调用结果对象使用
.shift()
方法来实现该目的,这样就不必设置loffset
了
base
:一个整数,默认为0.用于聚合过程中,当频率可以整除1D
(比如4H
)时,第一个完整的分组从哪个元素开始的。如rule='4H'
,base=2
,则Series[0:1]
作为一个分组,Series[2:6]....
作为一个分组....
on
:一个字符串,对于DataFrame
,它指定了重采样的列。该列必须是datetime-like
level
:一个字符串或者整数。对于MultiIndex
,该参数指定了被重采样的子索引
fill_method
:一个字符串,指定升采样时,如何插值。如'ffill'/'bfill'
。默认不插值
该参数被废弃。推荐使用
.resample().ffill()
这种方案。而limit
作为ffill()
的参数。
limit
:一个整数。指定向前或者向后填充时,运行连续填充的最大单元数量
kind
:一个字符串,指定聚合到时间段Period
还是时间戳Timestamp
。默认聚合到时间序列的索引类型
OHLC
重采样是计算bin
中的四个值:开盘值(第一个值)、收盘值(最后一个值)、最高值(最大值)、最低值(最小值)
另一种降采样的办法是:使用groupby
功能。如:
xxxxxxxxxx
series.groupby(lambda x:x.month).mean()
如果你想根据年份来聚合,则使用x.year
。
matplotlib
是一种比较低级的工具,pandas
中有许多利用DataFrame
对象数据组织特点来创建标准图表的高级绘图方法。
Series/DataFrame.plot()
:绘制图形。
xxxxxxxxxx
Series.plot(kind='line', ax=None, figsize=None, use_index=True, title=None, grid=None,
legend=False, style=None, logx=False, logy=False,loglog=False,xticks=None,yticks=None,
xlim=None, ylim=None, rot=None, fontsize=None, colormap=None, table=False, yerr=None,
xerr=None, label=None, secondary_y=False, **kwds)
DataFrame.plot(x=None, y=None, kind='line', ax=None, subplots=False, sharex=None,
sharey=False, layout=None, figsize=None, use_index=True, title=None, grid=None,
legend=True, style=None, logx=False, logy=False, loglog=False, xticks=None,
yticks=None, xlim=None, ylim=None, rot=None, fontsize=None, colormap=None,
table=False, yerr=None, xerr=None, secondary_y=False, sort_columns=False, **kwds)
kind
:绘制的类型。可以为:'line'
、'bar'
、'barh'
(水平的bar
)、'hist'
、'box'
、'kde'
(核密度估计)、'density'
(类似kde
)、'area'
、'pie'
ax
:一个Axes
实例对象。如果为空,则是plt.gca()
的返回值(当前Axes
)figsize
:一个元组,指定图片大小(单位为英寸)use_index
:一个布尔值。如果为True
,则使用index
作为X
轴。title
:图形的标题grid
:一个布尔值。如果为True
,则开启网格legend
:一个布尔值,如果为True
,则放置图例style
:一个列表或者字典,给出了每一列的线型logx
:一个布尔值,如果为True
,则x
轴为对数型logy
:一个布尔值,如果为True
,则y
轴为对数型loglog
:一个布尔值,如果为True
,则x
轴和y
轴都为对数型xticks
:一个序列,用于给出xticks
yticks
:一个序列,用于给出yticks
xlim
:一个二元的元组或者序列,给出x
轴范围ylim
:一个二元的元组或者序列,给出y
轴范围rot
:一个整数,给出了x
轴和y
轴tick
旋转角度(不是弧度)。fontsize
:一个整数,给出了xtick/ytick
的字体大小colormap
:一个字符串或者colormap
对象,给出了colormap
colorbar
:一个布尔值。如果为True
,则绘制colorbar
(只用于scatter
和hexbin
图中)position
:一个浮点数。给出了bar
图中,各bar
的对其位置(0表示bar
的左侧与它的坐标 对其;1表示bar
的右侧与它的坐标对其)layout
:一个元组。给出了(rows,columns)
table
:一个布尔值或者Series/DataFrame
。如果为True
,则将本Series/DataFrame
绘制为一个表格;如果为Series/DataFrame
,则将该参数绘制为表格yerr
:用于绘制Error Bar
xerr
:用于绘制Error Bar
label
:plot
的label
参数secondary_y
:一个布尔值或者一个整数序列。如果为True
,则y
轴绘制在右侧mark_right
:一个布尔值,如果为True
且secondary_y=True
,则在图例中标记为right
kwds
:传递给matplotlib
中的plot
函数的其他关键字参数在DataFrame.plot
中,下面的参数意义为:
x
:label
或者position
y
: label
或者position
subplots
:一个布尔值,如果为True
,则将每一列作为一个子图来绘制sharex
:一个布尔值。如果为True
,且subplots=True
,则子图共享x
轴sharey
:一个布尔值。如果为True
,且subplots=True
,则子图共享y
轴stacked
:一个布尔值。在bar
中,如果为True
,则将柱状图堆积起来sort_columns
:一个布尔值。如果为True
,则根据列名来决定绘制的先后顺序。它们返回的是AxesSubplot
对象,或者AxesSubplot
的ndarray
给出一组序列,我们可以手工绘制每个序列的散布图,以及各自的核密度估计。我们可以使用scatter_matrix
函数:
xxxxxxxxxx
pandas.tools.plotting.scatter_matrix(frame, alpha=0.5, figsize=None, ax=None,
grid=False, diagonal='hist', marker='.', density_kwds=None, hist_kwds=None,
range_padding=0.05, **kwds)
frame
:为DataFrame
对象diagonal
:选择对角线上的图形类型。可以为'hist'/'kde'
hist_kwds
:绘制hist
的参数density_kwds
:绘制kde
的参数range_padding
:一个浮点数,用于延伸x/y
轴的范围。如果它为0.1
,表示x
轴延伸x_max-xmin
的0.1倍
每一个子图是这样生成的:以DataFrame
中某一列为横坐标,另一列为纵坐标生成的散点图。时间序列的移动窗口上的各种统计函数是一种常见的操作。这一类函数我们称作移动窗口函数
与其他统计函数一样,移动窗口函数也排除了NA
值
所谓移动窗口,就是两层含义:
计算移动窗口的平均值:
xxxxxxxxxx
Series/DataFrame.rolling(window, min_periods=None, freq=None, center=False,
win_type=None, on=None, axis=0)
window
:一个整数或者一个offset
。如果是个整数,则给出了窗口的大小(窗口大小是固定的)。如果是个offset
,则每个窗口对应一个时间段,因此窗口大小不固定。min_periods
:一个整数。给出了窗口内有效值的数量。freq
:一个字符串或者DateOffset
对象,该参数被废弃。它用于对数据重采样,因为我们一般使用resample()
来完成,所以该参数被废弃。center
:一个布尔值。如果为True
,则聚合结果的label
为窗口的中心点的索引。默认情况下,聚合结果的label
为窗口的最右点的索引。(因为一个聚合结果对应了 window
个数据,因此该聚合结果可选的索引可以从这些数据的索引中选取)win_type
:一个字符串,给出了窗口类型on
:一个字符串。对于DataFrame
,它指定在哪一column
上进行移动平均。否则是index
axis
:一个整数。指定沿着0轴还是1轴移动平均。如果为0/'index'
则沿着0轴;如果为1/'columns'
则沿着0轴窗口类型可以为:
'boxcar'
'triang'
'blackman'
'hamming'
'bartlett'
'parzen'
'bohman'
'blackmanharris'
'nuttall'
'barthann'
'kaiser'
(需要beta
参数),该参数由后面的.mean()
等方法给出'guassian'
(需要std
参数),该参数由后面的.mean()
等方法给出'general_gaussian'
(需要power,width
参数),该参数由后面的.mean()
等方法给出'slepian'
(需要width
参数),该参数由后面的.mean()
等方法给出该方法返回一个Window
对象,你可以在该对象上调用.mean()/.sum()/.agg()/.aggregate()
等方法。
计算移动窗口的指数加权平均值:
xxxxxxxxxx
Series/DataFrame.ewm(com=None, span=None, halflife=None, alpha=None, min_periods=0,
freq=None, adjust=True, ignore_na=False, axis=0)
com
:一个浮点数,以center of mass
的方式给出了衰减因子。 span
:一个浮点数,以span
的方式给出了衰减因子。 halflife
:一个浮点数,以halflife
的方式给出了衰减因子: alpha
:一个浮点数,为光滑因子。这种方式直接给出了 ,要求 min_periods
:一个整数。给出了窗口内有效值的数量。adjust
:一个布尔值。见下面的解释。ignore_na
:一个布尔值,如果为True
,则计算权重时,忽略缺失值。加权移动平均的计算公式为:
其中 为输入值。
adjust=True
时, ,此时:adjust=False
时它等价于
上式中的 有四种方式,其中最简单的就是直接设置 alpha
参数。剩下的三种就是间接给出:
该函数返回的是一个EWM
对象。其统计方法有:
mean()
:指数加权移动平均的均值var()
:指数加权移动平均的方差std()
:指数加权移动平均的标准差corr()
:指数加权移动平均的相关系数cov()
:指数加权移动平均的协方差
拓展窗口是rolling
窗口的特殊情况:当窗口大小等于序列长度。另外expanding
窗口中,如果数据有空缺,则剔除空缺值再计算。
xxxxxxxxxx
DataFrame/Series.expanding(min_periods=1, freq=None, center=False, axis=0)
min_periods
:一个整数。给出了窗口内有效值的数量。freq
:一个字符串或者DateOffset
对象,该参数被废弃。它用于对数据重采样,因为我们一般使用resample()
来完成,所以该参数被废弃。center
:一个布尔值。如果为True
,则label
为窗口的中心的值。默认情况下,label
为窗口的右侧的值。axis
:一个整数。指定沿着0轴还是1轴移动平均。如果为0/'index'
则沿着0轴;如果为1/'columns'
则沿着0轴它返回一个Expanding
对象。
它的统计方法如下:
count()
:有效值数量sum()
:和mean()
:均值median()
:中位数min()
:最小值max()
:最大值std()
:标准差var()
:方差skew()
:斜度kurt()
:峰度quantile()
:百分位数apply()
:通用处理函数。其参数为一个可调用对象,该可调用对象接受一个序列,返回一个标量。cov()
:协方差corr()
:相关系数
在
Center
中,2016-11-01
为中心的话,它右侧有4个数据,左侧理论上有5个数据(窗口总长为10),而左侧为空,因此第一个窗口就是前 5 个数据的统计量。
read_csv
可以读取文本文件(.csv
格式):
xxxxxxxxxx
pandas.read_csv(filepath_or_buffer, sep=', ', delimiter=None, header='infer',
names=None, index_col=None, usecols=None, squeeze=False, prefix=None,
mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None,
false_values=None, skipinitialspace=False,skiprows=None, nrows=None,na_values=None,
keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True,
parse_dates=False, infer_datetime_format=False,keep_date_col=False,date_parser=None,
dayfirst=False, iterator=False, chunksize=None, compression='infer', thousands=None,
decimal='.', lineterminator=None, quotechar='"', quoting=0, escapechar=None,
comment=None, encoding=None, dialect=None, tupleize_cols=False,
error_bad_lines=True, warn_bad_lines=True, skipfooter=0, skip_footer=0,
doublequote=True, delim_whitespace=False, as_recarray=False,
compact_ints=False, use_unsigned=False, low_memory=True,
buffer_lines=None, memory_map=False, float_precision=None)
filepath_or_buffer
:一个字符串,或者一个pathlib.Path
对象,或者任何拥有.read()
方法的对象。它指定了被解析的文件的位置。如果是个字符串,则必须是个URL
(其中包含了协议名,如http//,ftp//,file//
等)
sep
:一个字符串,指定了分隔符。默认为','
。如果设定为None
,则自动决议分隔符。
'\s+\
解析为空白符delimiter
:一个字符串,指定了分隔符。它是sep
参数的另一个候选参数
delim_whitespace
:一个布尔值。如果为True
,则将空白符(连续的空白或者单个空白)作为分隔符。此时不需要提供delimiter
参数。它等价于sep='\s+'
header
:一个整数或者整数列表。它指定了那些行是标题行,0表示第一行。如果你指定了header=[1,3,5]
,则第三行(行id=2
)和第五行(行id=4
)被忽略(不被解析)。
names
参数为空,则header
默认值为 0.如果names
参数提供了,则header
默认值为None
- 该参数会忽略注释行。 - 如果`skip_blank_lines=True`,则该参数会忽略空白行。因此`header=0`表示第一个有效的数据行
names
:一个array-like
。它给出了列名。
names
传入列名mangle_dupe_cols=True
,则可以传入重复的列名。否则不允许重复列名index_col
:一个整数,或者序列,或者False
。它指定哪一列作为row labels
。如果你指定了一个序列,则使用MultiIndex
。如果为False
,则不采用任何列作为row labels
usecols
:一个array-like
。它指定:你将采用哪些列来组装DataFrame
。该参数各元素必须要么是代表位置的整数,要么是代表列名的字符串
as_recarray
:一个布尔值。被废弃的参数。
squeeze
:一个布尔值。如果为True
,则当解析结果只有一列数据时,返回一个Series
而不是DataFrame
prefix
:一个字符串。当没有标题时,你可以提供这个参数来给列名加一个前缀。(如果不加前缀,则列名就是0,1,2...
)
mangle_dupe_cols
:一个布尔值。如果为True
,则重复的列名X,X...
被修改为X.0,X.1,...
。如果为False
,则重复的列名这样处理:后面的覆盖前面的
dtype
:一个Type name
或者字典:column->type
。它可以给出每个列的类型。
engine
:一个字符串,指定用什么解析引擎。可以为'c'/'python'
。c
更快,但是python
拥有更多特性
converters
:一个字典,给出了每一列的转换函数。字典的键为代表列的位置的整数,或者代表列的名字的字符串。字典的值为可调用对象,参数为一个标量(就是每个元素值)
true_values
:一个列表,给出了哪些值被认为是True
false_values
:一个列表,给出了哪些值被认为是False
skipinitialspace
:一个布尔值。如果为True
,则跳过分隔符之后的空白符
skiprows
:一个array-like
或者整数。如果为序列,则指定跳过哪些行(从0计数);如果为整数,则指定跳过文件开头的多少行。注意:空行和注释行也包括在内,这一点和header
不同。
skipfooter
:一个整数。指定跳过文件结尾的多少行。不支持engine='c'
skip_footer
:被废弃的参数
nrows
:一个整数。指定读取多少行。
na_values
:一个标量、字符串、字典、列表。指定哪些被识别为NAN
。默认的NAN
为列表['nan','NAN','NULL'....]
keep_default_na
:一个布尔值。如果为True
,则当你指定了na_values
时,默认的NAN
被追加到na_values
上;否则指定的na_values
代替了默认的NAN
na_filter
:一个布尔值。如果为True
,则不检查NaN
,此时解析速度大大加快(但是要求你的数据确实没有NAN
)
verbose
:一个布尔值。如果为True
,输出解析日志
skip_blank_lines
:一个布尔值。如果为True
,则跳过空白行,而不是解析为NaN
parse_dates
:一个布尔值、整数列表、标签列表、或者list of list or dict
。对于iso8601
格式的日期字符串,解析速度很快。
True
,则解析index
为日期[[1,3]]
,则将列1和列3组合在一起,解析成一个单独的日期列{'aaa':[1,3]}
,则将列1和列3组合在一起,解析成一个单独的日期列,日期列的名字为'aaa'
。infer_datetime_format
:一个布尔值。如果为True
,且parse_dates
非空,则pandas
试图从数据中推断日期格式。
keep_date_col
:一个布尔值。如果为True
,并且parse_dates
使用多个列合成一列日期,则保留原有的列
date_parser
:一个函数对象。它将一列字符串转换成一列日期。
dayfirse
:一个字符串。如果为True
,则日期格式为DD/MM
iterator
:一个布尔值。如果为True
,则返回一个TextFileReader
对象,该对象可以用于迭代或者.get_chunk()
来返回数据块
chunksize
:一个整数。指定TextFileReader
对象.get_chunk()
返回的数据块的大小。
compression
:一个字符串。可以为'infer','gzip','bz2','zip','xz',None
。如果文件为压缩文件,则它用于指定解压格式
thousands
:一个字符串。指定了数值中千位数的分隔符,如999,999,999
decimal
:一个字符串,指定了小数点的分隔符,如9.999
float_precision
:一个字符串。指定了C engine
的转换浮点数的精度。None
普通转换,'high'
为高精度转换,'round_trip'
为round_trip
转换。
lineterminator
:一个长度为1的字符串。指定了C engine
中的换行符
quotechar
:一个长度为1的字符串,它指定了引用字符。比如"aaa,bbb"
,这种数据是引用数据。如果你用,
分隔,则有问题。在引用字符包围的数据中,不考虑分隔符。
comment
:一个长度为1的字符串,指定了注释字符。如果该字符串出现在行中,则行末的字符不被解析。如果该字符串出现在行首,则本行不被就解析。
encoding
:一个字符串,指定了编码类型
error_bad_lines
:一个布尔值。如果为True
,则如果某一行有太多字段,则函数抛出异常。如果为False
,则抛弃该行,顺利解析。只用于C engine
warn_bad_lines
:一个布尔值。如果为True
,且error_bad_lines=False
,则对于异常的行,输出警告
buffer_lines/compact_ints /use_unsigned
:被废弃的参数
memory_map
:如果为True
,且filepath
是一个文件名,则使用内存映射,将文件映射到内存中。
read_table
也能完成read_csv
的功能。二者接口一致。
xxxxxxxxxx
pandas.read_table(filepath_or_buffer, sep='\t', delimiter=None, header='infer',
names=None, index_col=None, usecols=None, squeeze=False, prefix=None,
mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None,
false_values=None, skipinitialspace=False,skiprows=None, nrows=None, na_values=None,
keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True,
parse_dates=False,infer_datetime_format=False,keep_date_col=False, date_parser=None,
dayfirst=False, iterator=False, chunksize=None, compression='infer', thousands=None,
decimal='.', lineterminator=None, quotechar='"', quoting=0, escapechar=None,
comment=None, encoding=None, dialect=None, tupleize_cols=False,
error_bad_lines=True, warn_bad_lines=True, skipfooter=0, skip_footer=0,
doublequote=True, delim_whitespace=False, as_recarray=False,
compact_ints=False, use_unsigned=False, low_memory=True,
buffer_lines=None, memory_map=False, float_precision=None)
DataFrame/Series.to_csv
方法可以将数据写入到文件中
xxxxxxxxxx
DataFrame.to_csv(path_or_buf=None, sep=', ', na_rep='', float_format=None,
columns=None, header=True, index=True, index_label=None, mode='w',
encoding=None, compression=None, quoting=None, quotechar='"',
line_terminator='\n', chunksize=None, tupleize_cols=False, date_format=None,
doublequote=True, escapechar=None, decimal='.')
Series.to_csv(path=None, index=True, sep=', ', na_rep='', float_format=None,
header=False, index_label=None, mode='w', encoding=None, date_format=None,
decimal='.')
path_or_buf
:一个字符串或者file
对象。指定写入的文件。如果为空,则返回一个字符串而不是写入文件sep
:一个字符串,指定字段的分隔符na_rep
:一个字符串,指定NaN
的代表字符串float_format
:一个字符串,指定了浮点数的格式化字符串columns
:一个序列,指定要写入哪些列header
:一个布尔值或者字符串列表。如果为True
,则写出列名。如果为字符串列表,则它直接指定了列名的别名index
:一个布尔值。如果为True
,则输出index label
mode
:一个字符串,文件操作的读写模式。默认为'w'
encoding
:一个字符串,指定编码方式compression
:一个字符串,指定压缩格式line_terminator
:一个字符串,指定换行符chunksize
:一个整数,指定了一次写入多少行date_format
:一个字符串,给出了日期格式化字符串decimal
:一个字符串,给出了小数点的格式tupleize_cols
:一个布尔值。如果为True
,则MultiIndex
被写成list of tuples
read_json
能够读取Json
文件:
xxxxxxxxxx
pandas.read_json(path_or_buf=None, orient=None, typ='frame', dtype=True,
convert_axes=True, convert_dates=True, keep_default_dates=True, numpy=False,
precise_float=False, date_unit=None, encoding=None, lines=False)
path_or_buf
:一个字符串或者一个file-like
对象。如果是个字符串,则必须是个URL
(其中包含了协议名,如http//,ftp//,file//
等)orient
:一个字符串,指定了期望的JSON
格式。可选的格式有(参考to_json
的实例):'split'
:JSON
是个类似字典的格式:{index -> [index], columns -> [columns], data -> [values]}
'records'
:JSON
是个类似列表的格式:[{column -> value}, ... , {column -> value}]
'index'
: JSON
是个类似字典的格式{index -> {column -> value}}
'columns'
:JSON
是个类似字典的格式{column -> {index -> value}}
'values'
:JSON
就是值的序列 注意:如果type=='series'
,则允许的'orients= {'split','records','index'}
,默认为'index'
,且如果为'index'
,则要求索引为唯一的。如果type=='frame'
,则允许上所有的格式,默认为'columns'
,且如果为'index'/'columns'
,则要求DataFrame.index
为唯一的;如果'index'/'columns'/'records'
,则要求DataFrame.columns
为唯一的
typ
:一个字符串,指定将JSON
转换为Series/DataFrame
那一种。可以为'series'
,'frame'
dtype
:一个布尔值或者字典。如果为True
,则自动推断数值类型。如果为False
,则不推断类型。如果为字典,则给出了每一列的数值类型convert_axes
:一个布尔值,如果为True
,则试图转换到合适的数值类型convert_dates
:一个布尔值,如果为True
,则试图转换日期列为日期。它转换下面这些列名的列:列名以'_at'/'_time'
结束、列名以'timestamp'
开始、列名为'mofified'/'date'
keep_default_dates
:一个布尔值。如果为True
,则当转换日期列时,保留原列numpy
:一个布尔值,如果为True
,则直接转换为ndarray
precise_float
:一个布尔值,如果为True
,则使用解析为更高精度的浮点数date_unit
:一个字符串。用于转换时间戳到日期。它提供时间戳的单位,如's'/'ms'
lines
:一个布尔值。如果为True
,则读取文件的每一行作为一个JSON
-encoding
:一个字符串,指定编码方式将pandas
对象保存成JSON
:
xxxxxxxxxx
Series/DataFrame.to_json(path_or_buf=None, orient=None, date_format='epoch',
double_precision=10, force_ascii=True, date_unit='ms', default_handler=None,
lines=False)
path_or_buf
:指定保存的地方。如果为None
,则该函数返回一个StringIO
对象orient
参数:参考read_json()
date_format
:一个字符串,指定日期转换格式。可以为'epoch'
(从1970-1-1
日以来的毫秒数)、'iso'
double_precision
:一个整数,指定了浮点数的精度force_ascii
:一个布尔值,如果为True
,则将encoded string
转换成ASCII
date_unit
:一个字符串,参考read_json
default_handler
:一个可调用对象。用于处理当对象无法转换成JSON
的情况。它只有一个参数,就是被转换的对象lines
:一个布尔值。如果orient='records'
时,输出换行符。对其他格式则抛出异常pandas.read_pickle(path)
可以从pickle
文件中读取数据,path
为pickle
文件的文件名。
Series/DataFrame.to_pickle(path)
:将Series/DataFrame
保存到pickle
文件中,path
为pickle
文件的文件名。
read_excel
读取Excel
文件。需要用到第三方包xlrd/xlwt
,前者读excel
,后者写excel
xxxxxxxxxx
pandas.read_excel(io, sheetname=0, header=0, skiprows=None, skip_footer=0,
index_col=None, names=None, parse_cols=None, parse_dates=False, date_parser=None,
na_values=None, thousands=None, convert_float=True, has_index_names=None,
converters=None, true_values=None, false_values=None, engine=None,
squeeze=False, **kwds)
io
:一个字符串,或者file-like
对象。如果是个字符串,则必须是个URL
(其中包含了协议名,如http//,ftp//,file//
等)sheetname
:一个字符串或者整数,或者列表。它指定选取Excel
文件中哪个sheet
。字符串指定的是sheet
名,整数指定的是sheet
的位置(0为第一个sheet
)engine
:一个字符串,指定了读写Excel
的引擎。可以为:io.excel.xlsx.writer
、io.excel.xls.writer
、io.excel.xlsm.writer
、read_csv
保存DataFrame
到Excel
文件:
xxxxxxxxxx
DataFrame.to_excel(excel_writer, sheet_name='Sheet1', na_rep='',
float_format=None, columns=None, header=True, index=True, index_label=None,
startrow=0, startcol=0, engine=None, merge_cells=True, encoding=None,
inf_rep='inf', verbose=True)
excel_writer
:一个字符串(文件名)或者一个ExcelWriter
对象sheet_name
:一个字符串,指定sheet
名na_rep
:一个字符串,代表NaN
startrow/startcol
:指定了左上角的单元格的位置engine
:一个字符串,指定了读写Excel
的引擎。可以为:io.excel.xlsx.writer
、io.excel.xls.writer
、io.excel.xlsm.writer
、merge_cells
:一个布尔值。如果为True
,则多级索引中,某些索引会合并单元格inf_rep
:一个字符串,只代表无穷大。read_html
可以将HTML
中的<table></table>
解析为一个DataFrame
列表。
xxxxxxxxxx
pandas.read_html(io, match='.+', flavor=None, header=None, index_col=None,
skiprows=None, attrs=None, parse_dates=False, tupleize_cols=False,
thousands=', ', encoding=None, decimal='.', converters=None,
na_values=None, keep_default_na=True)
io
:为一个字符串或者一个file-like
对象。match
:一个字符串或者正则表达式。HTML
中的<table></table>
中,只要匹配这个正则表达式的表格都被处理。默认的为匹配任何非空的表格flavor
:一个字符串,指定了解析引擎。可以为'bs4'
或者'html5lib'
或者'lxml'
attrs
:一个字典。它筛选出你要解析哪些表格read_csv
可以通过DataFrame.to_html()
转换为HTML
的表格:
xxxxxxxxxx
DataFrame.to_html(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, bold_rows=True,
classes=None, escape=True, max_rows=None, max_cols=None, show_dimensions=False,
notebook=False, decimal='.', border=None)
bold_rows
:一个布尔值。如果为True
,则让row label
加粗classes
:一个字符串或者列表或者元组,给出了table
的css class
escape
:一个布尔值,如果为True
,则将字符<>&
为安全的HTML
字符max_rows
:一个整数,指定最大输出行数。默认显示全部的行decimal
:一个字符串,指定了小数点的格式border
:一个整数,给出了border
属性的值。buf
:指定将HTML
写到哪里,它是一个StringIO-like
对象col_space
:一个整数,给出每一列最小宽度header
:一个布尔值,如果为True
,则打印列名columns
:一个序列,指定要输出哪些列index
:一个布尔值,如果为True
,则打印index labels
formatters
:一个一元函数的列表,或者一元函数的字典。给出了每一列的转换成字符串的函数float_format
:一个一元函数,给出了浮点数转换成字符串的函数justify
:左对齐还是右对齐。可以为'left'
/'right'
read_sql_table
从指定数据表中,提取你所需要的列。
xxxxxxxxxx
pandas.read_sql_table(table_name, con, schema=None, index_col=None,
coerce_float=True, parse_dates=None, columns=None, chunksize=None)
table_name
:一个字符串,指定了数据库的表名
con
:一个SQLAlchemy conectable
或者一个database string URI
,指定了连接对象它就是SQLAlchemy
中的Engine
对象。
schema
:一个字符串,给出了SQL schema
(在mysql
中就是database
)
index_col
:一个字符串或者字符串列表,指定哪一列或者哪些列作为index
coerce_float
:一个布尔值,如果为True
,则试图转换结果到数值类型
parse_dates
:一个列表或者字典。指定如何解析日期:
{col_name:format_str}
:给出了那些列被解析为日期,以及解析字符串{col_name:arg dict}
:给出了哪些列被解析为日期,arg dict
将传递给pandas.to_datetime()
函数来解析日期columns
:一个列表,给出了将从sql
中提取哪些列
chunksize
:一个整数。如果给出了,则函数返回的是一个迭代器,每次迭代时,返回chunksize
行的数据。
read_sql_query
可以选择select query
语句。因此你可以执行多表联合查询。
xxxxxxxxxx
pandas.read_sql_query(sql, con, index_col=None, coerce_float=True,
params=None, parse_dates=None, chunksize=None)
sql
:一个SQL
查询字符串,或者SQLAlchemy Selectable
对象。params
:一个列表,元组或者字典。用于传递给sql
查询语句。比如:sql
为uses %(name)s...
,因此params
为{'name':'xxxx'}
read_sql_table
read_sql
是前两者的一个包装,它可以根据sql
参数,自由地选择使用哪个方式。
xxxxxxxxxx
pandas.read_sql(sql, con, index_col=None, coerce_float=True, params=None,
parse_dates=None, columns=None, chunksize=None)
sql
:一个数据表名,或者查询字符串,或者SQLAlchemy Selectable
对象。如果为表名,则使用read_sql_table
;如果为后两者,则使用read_sql_query
pandas
对象的.to_sql()
方法用于插入数据库。
xxxxxxxxxx
Series/DataFrame.to_sql(name, con, flavor=None, schema=None, if_exists='fail',
index=True, index_label=None, chunksize=None, dtype=None)
name
:一个字符串,指定表名con
:一个SQLAlchemy conectable
或者一个database string URI
,指定了连接对象。它就是SQLAlchemy
中的Engine
对象。flavor
:被废弃的参数schema
:一个字符串,指定了SQL schema
if_exists
:一个字符串,指定当数据表已存在时如何。可以为:'fail'
:什么都不做(即不存储数据)'replace'
:删除数据表,创建新表,然后插入数据'append'
:如果数据表不存在则创建数据表然后插入数据。入股数据表已存在,则追加数据index
:一个布尔值。如果为True
,则将index
作为一列数据插入数据库index_label
:index
的存储名。如果index=True
,且index_label=None
,则使用index.name
chunksize
:一个整数。 如果为None
,则一次写入所有的记录。如果非空,则一次写入chunksize
大小的记录dtype
:一个字典。给出了各列的存储类型。