本文参考1
pandas导入
|
|
琐碎
read_csv()默认有表头,会跳过第一行,从第二行开始读起。如果我们要读取的文件,直接就是数据,没有所谓的表头,就需 read_csv(header=None).
when bad lines exist in file:
12ERROR : pandas.errors.ParserError: Error tokenizing data. C error: Expected 1024 fields in line 237, saw 1491data = pd.read_csv('file1.csv', error_bad_lines=False)
数据结构
Pandas处理以下三种数据结构:系列(Series),数据帧(DataFrame),面板(Panel)
系列是具有均匀数据的一维数组结构,尺寸大小不变但数据可变
数据帧(DataFrame)是一个具有异构数据的二维数组,尺寸大小可变且数据可变
面板是具有异构数据的三维数据结构,尺寸大小可变且数据可变
系列(Series)
系列(Series
)是能够保存任何类型的数据(整数,字符串,浮点数,Python对象等)的一维标记数组,轴标签统称为索引。
|
|
创建系列
创建一个空的系列
|
|
ndarray创建一个系列
|
|
从字典创建一个系列
|
|
从标量创建一个系列
|
|
系列访问
使用位置index访问
|
|
使用标签检索
|
|
数据帧(DataFrame)
数据帧(DataFrame)是二维数据结构,即数据以行和列的表格方式排列。
|
|
创建数据帧
|
|
通过列表创建
可以使用单个列表或列表列表创建数据帧(DataFrame)
|
|
通过ndarrays/Lists的字典创建
所有的ndarrays
必须具有相同的长度。如果传递了索引(index
),则索引的长度应等于数组的长度。
如果没有传递索引,则默认情况下,索引将为range(n)
,其中n
为数组长度。
|
|
通过字典创建
字典列表可作为输入数据传递以用来创建数据帧(DataFrame),字典键默认为列名。
|
|
通过系列创建
字典的系列可以传递以形成一个DataFrame。 所得到的索引是通过的所有系列索引的并集。
|
|
数据帧访问
列选择
|
|
列添加
|
|
列删除
列可以删除或弹出
|
|
行选择
|
|
行切片
可以使用:
运算符选择多行
|
|
附加行
使用append()
函数将新行添加到DataFrame
|
|
删除行
使用索引标签从DataFrame中删除或删除行。 如果标签重复,则会删除多行。
|
|
面板(Panel)
Pandas基本功能
系列基本功能
|
|
axes
|
|
empty
返回布尔值,表示对象是否为空。返回True
则表示对象为空。
|
|
ndim
返回对象的维数。根据定义,一个系列是一个1D
数据结构
|
|
size
返回系列的大小(长度)
|
|
values
|
|
head-tail
head()
返回前n
行(观察索引值)。要显示的元素的默认数量为5
,但可以传递自定义这个数字值。
tail()
返回最后n
行(观察索引值)。 要显示的元素的默认数量为5
,但可以传递自定义数字值。
|
|
DataFrame基本功能
Pandas描述性统计
- 类似于:
sum()
,cumsum()
函数能与数字和字符(或)字符串数据元素一起工作,不会产生任何错误。字符聚合从来都比较少被使用,虽然这些函数不会引发任何异常。- 当DataFrame包含字符或字符串数据时,像
abs()
,cumprod()
这样的函数会抛出异常。
创建一个数据帧
|
|
Age | Name | Rating | |
---|---|---|---|
0 | 25 | Tom | 4.23 |
1 | 26 | James | 3.24 |
2 | 25 | Ricky | 3.98 |
3 | 23 | Vin | 2.56 |
4 | 30 | Steve | 3.20 |
5 | 29 | Minsu | 4.60 |
6 | 23 | Jack | 3.80 |
7 | 34 | Lee | 3.78 |
8 | 40 | David | 2.98 |
9 | 30 | Gasper | 4.80 |
10 | 51 | Betina | 4.10 |
11 | 46 | Andres | 3.65 |
sum()
返回所请求轴的值的总和。 默认情况下,轴为索引(axis=0
),即对列sum
|
|
axis=1,则对行sum
|
|
mean()
与sum()用法一样,默认是对列求均值;mean(1)则是对每一行求均值。
std()
返回数字列的Bressel标准偏差。
数据汇总
describe()函数是用来计算有关DataFrame列的统计信息的摘要。
|
|
include是用于传递关于什么列需要考虑用于总结的必要信息的参数。获取值列表; 默认情况下是”数字值”。
object
- 汇总字符串列number
- 汇总数字列all
- 将所有列汇总在一起(不应将其作为列表值传递)
|
|
Pandas函数
以下三种方法是要将自己或其他库的函数应用于Pandas对象,使用适当的方法取决于函数是否期望在整个DataFrame,行或列或元素上进行操作。
- pipe() : 表明智函数应用
- apply() : 行或列函数应用
- applymap() : 元素函数应用
pipe表格函数
可以通过将函数和适当数量的参数作为管道参数来执行自定义操作。 因此,对整个DataFrame执行操作。例如,为DataFrame中的所有元素相加一个值2
。
|
|
appy行或列智能函数应用
可以使用apply()
方法沿DataFrame
或Panel
的轴应用任意函数,它与描述性统计方法一样,采用可选的轴参数。 默认情况下,操作按列执行,将每列列为数组。指定axis=1,则按照行执行
|
|
|
|
applymap元素智能函数
并不是所有的函数都可以向量化(也不是返回另一个数组的NumPy数组,也不是任何值),在DataFrame上的方法applymap()
和类似地在Series上的map()
接受任何Python函数,并且返回单个值。
|
|
Pandas重建索引
重新索引会更改DataFrame的行标签和列标签。重新索引意味着符合数据以匹配特定轴上的一组给定的标签。
可以通过索引来实现多个操作 -
- 重新排序现有数据以匹配一组新的标签。
- 在没有标签数据的标签位置插入缺失值(NA)标记。
|
|
重建索引与其他对象对齐
有时可能希望采取一个对象和重新索引,其轴被标记为与另一个对象相同。
|
|
注意 - 在这里,
df1
数据帧(DataFrame)被更改并重新编号,如df2
。 列名称应该匹配,否则将为整个列标签添加NAN
。
填充时重新加注
reindex()
采用可选参数方法,它是一个填充方法,其值如下:
pad/ffill
- 向前填充值bfill/backfill
- 向后填充值nearest
- 从最近的索引值填充
|
|
注 - 最后四行被填充了。
重建索引时的填充限制
限制参数在重建索引时提供对填充的额外控制。限制指定连续匹配的最大计数
|
|
注意 - 只有第
7
行由前6
行填充。 然后,其它行按原样保留。
重命名
rename()
方法允许基于一些映射(字典或者系列)或任意函数来重新标记一个轴。
|
|
Pandas迭代
Pandas
对象之间的基本迭代的行为取决于类型。当迭代一个系列时,它被视为数组式,基本迭代产生这些值。其他数据结构,如:DataFrame
和Panel
,遵循类似惯例迭代对象的键。
简而言之,基本迭代(对于i
在对象中)产生 -
- Series - 值
- DataFrame - 列标签
- Pannel - 项目标签
DataFrame迭代
要遍历数据帧(DataFrame)中的行,可以使用以下函数 -
iteritems()
- 迭代(key,value)
对iterrows()
- 将行迭代为(索引,系列)对itertuples()
- 以namedtuples
的形式迭代行
注意 - 不要尝试在迭代时修改任何对象。迭代是用于读取,迭代器返回原始对象(视图)的副本,因此更改将不会反映在原始对象上。
|
|
iteritems()
将每个列作为键,将值与值作为键和列值迭代为Series对象。
|
|
iterrows()
iterrows()
返回迭代器,产生每个索引值以及包含每行数据的序列。
|
|
itertuples()
itertuples()
方法将为DataFrame
中的每一行返回一个产生一个命名元组的迭代器。元组的第一个元素将是行的相应索引值,而剩余的值是行值。
|
|
Pandas排序
Pandas有两种排序方式,它们分别是 -
- 按标签
- 按实际值
以标签排序
使用sort_index()
方法,通过传递axis
参数和排序顺序,可以对DataFrame
进行排序。 默认情况下,按照升序对行标签进行排序。
通过传递axis
参数值为0
或1
,可以对列标签进行排序。 默认情况下,axis = 0
,逐行排列。
|
|
以值排序
像索引排序一样,sort_values()
是按值排序的方法。它接受一个by
参数,它将使用要与其排序值的DataFrame
的列名称。
|
|
通过by
参数指定需要列值。
|
|
先对col1列排序,使该列有序,同时col2也对应变化为3,2,4,1.接着对col2列排序,这时对前一列相同的值情况下再排序,即3,2,4排序为2,3,4.这样前一列还是有序的
Pandas索引和数据选择
.loc()
.loc()
具有多种访问方式,如 -
- 单个标量标签
- 标签列表
- 切片对象
- 一个布尔数组
loc
需要两个单/列表/范围运算符,用","
分隔。第一个表示行,第二个表示列
|
|
.iloc()
Pandas提供了各种方法,以获得纯整数索引。像python和numpy一样,第一个位置是基于0
的索引。
各种访问方式如下 -
- 整数
- 整数列表
- 系列值
|
|
.ix()
除了基于纯标签和整数之外,Pandas还提供了一种使用.ix()
运算符进行选择和子集化对象的混合方法。
|
|
多轴索引
使用基本索引运算符[]
|
|
可以使用属性运算符.
来选择列。
|
|
统计函数
pct_change()函数
系列,DatFrames和Panel都有pct_change()
函数。此函数将每个元素与其前一个元素进行比较,并计算变化百分比。
认情况下,pct_change()
对列进行操作; 如果想应用到行上,那么可使用axis = 1
参数。
|
|
cov()协方差
协方差适用于系列数据。Series对象有一个方法cov
用来计算序列对象之间的协方差。NA
将被自动排除。
|
|
当应用于DataFrame
时,协方差方法计算所有列之间的协方差(cov
)值。
|
|
注 - 观察第一个语句中
a
和b
列之间的cov
结果值,与由DataFrame上的cov
返回的值相同。
相关性函数
相关性显示了任何两个数值(系列)之间的线性关系。有多种方法来计算pearson
(默认),spearman
和kendall
之间的相关性。
|
|
如果DataFrame中存在任何非数字列,则会自动排除。
数据排名
数据排名为元素数组中的每个元素生成排名,不是比大小哦。在关系的情况下,分配平均等级。
|
|
Pandas窗口函数
为了处理数字数据,Pandas提供了几个变体,如滚动,展开和指数移动窗口统计的权重。 其中包括总和,均值,中位数,方差,协方差,相关性等。
.rolling()
这个函数可以应用于Series数据。指定window=n
参数并在其上应用适当的统计函数。
窗口大小指定几行数据进行运算
|
|
.expanding()
这个函数可以应用于Series数据。 指定min_periods = n
参数并在其上应用适当的统计函数。
|
|
.ewm()
ewm()
可应用于系列数据。指定com
,span
,halflife
参数,并在其上应用适当的统计函数。它以指数形式分配权重。
|
|
Pandas聚合
当有了滚动,扩展和ewm
对象创建了以后,就有几种方法可以对数据执行聚合。
在整个数据框上应用聚合
|
|
在数据框的单个列上应用聚合
|
|
在DataFrame的多列上应用聚合
|
|
在DataFrame的单个列上应用多个函数
|
|
在DataFrame的多列上应用多个函数
|
|
将不同的函数应用于DataFrame的不同列
|
|
Pandas缺失数据
|
|
使用重构索引(reindexing),创建了一个缺少值的DataFrame。 在输出中,
NaN
表示不是数字的值。
检查缺失值
为了更容易地检测缺失值(以及跨越不同的数组dtype
),Pandas提供了isnull()
和notnull()
函数,它们也是Series和DataFrame对象的方法
|
|
缺失数据的计算
- 在数据计算时,
NA
将被视为0
- 如果数据全部是
NA
,那么结果将是0
|
|
缺失数据清理/填充
Pandas提供了各种方法来清除缺失的值。fillna()
函数可以通过几种方法用非空数据“填充”NA
值
|
|
方法 | 行为 |
---|---|
pad/fill | 填充的方法向前 |
bfill/backfill | 填充的方法向后 |
|
|
放弃缺失值
如果只想排除缺少的值,则使用dropna
函数和axis
参数。 默认情况下,axis = 0
,即在行上应用,这意味着如果行内的任何值是NA
,那么整个行被排除。
|
|
值替换
很多时候,必须用一些具体的值取代一个通用的值。可以通过应用替换方法来实现这一点。
用标量值替换NA
是fillna()
函数的等效行为。
|
|
Pandas分组
|
|
数据拆分成组
Pandas对象可以分成任何对象。有多种方式来拆分对象,如 -
- obj.groupby(‘key’)
- obj.groupby([‘key1’,’key2’])
- obj.groupby(key,axis=1)
单列分组
|
|
多列分组
|
|
迭代遍历分组
|
|
选择一个分组
使用get_group()
方法,可以选择一个组。
|
|
聚合
聚合函数为每个组返回单个聚合值。当创建了分组(group by)对象,就可以对分组数据执行多个聚合操作。一个比较常用的是通过聚合或等效的agg
方法聚合
|
|
另一种查看每个分组的大小的方法是应用size()
函数
|
|
一次应用多个聚合函数, 通过分组系列,还可以传递函数的列表或字典来进行聚合,并生成DataFrame
作为输出
|
|
转换:分组或列上的转换返回索引大小与被分组的索引相同的对象。因此,转换应该返回与组块大小相同的结果。
|
|
过滤:过滤根据定义的标准过滤数据并返回数据的子集。filter()
函数用于过滤数据。
|
|
Pandas合并/连接
Pandas具有功能全面的高性能内存中连接操作,与SQL等关系数据库非常相似。 Pandas提供了一个单独的merge()
函数,作为DataFrame对象之间所有标准数据库连接操作的入口
|
|
在这里,有以下几个参数可以使用 -
- left - 一个DataFrame对象。
- right - 另一个DataFrame对象。
- on - 列(名称)连接,必须在左和右DataFrame对象中存在(找到)。
- left_on - 左侧DataFrame中的列用作键,可以是列名或长度等于DataFrame长度的数组。
- right_on - 来自右的DataFrame的列作为键,可以是列名或长度等于DataFrame长度的数组。
- left_index - 如果为
True
,则使用左侧DataFrame中的索引(行标签)作为其连接键。 在具有MultiIndex(分层)的DataFrame的情况下,级别的数量必须与来自右DataFrame的连接键的数量相匹配。 - right_index - 与右DataFrame的left_index具有相同的用法。
- how - 它是left, right, outer以及inner之中的一个,默认为内inner。 下面将介绍每种方法的用法。
- sort - 按照字典顺序通过连接键对结果DataFrame进行排序。默认为
True
,设置为False
时,在很多情况下大大提高性能。
|
|
|
|
on参数
在一个键上合并两个数据帧
|
|
合并多个键上的两个数据框
|
|
how参数
|
|
Pandas级联
Pandas提供了各种工具(功能),可以轻松地将Series
,DataFrame
和Panel
对象组合在一起。
|
|
- objs - 这是Series,DataFrame或Panel对象的序列或映射。
- axis -
{0,1,...}
,默认为0
,这是连接的轴。 - join -
{'inner', 'outer'}
,默认inner
。如何处理其他轴上的索引。联合的外部和交叉的内部。 - ignore_index − 布尔值,默认为
False
。如果指定为True
,则不要使用连接轴上的索引值。结果轴将被标记为:0,...,n-1
。 - join_axes - 这是Index对象的列表。用于其他
(n-1)
轴的特定索引,而不是执行内部/外部集逻辑。
|
|
结果的索引是重复的; 每个索引重复。如果想要生成的对象必须遵循自己的索引,请将ignore_index
设置为True
。
|
|
如果需要沿axis=1
添加两个对象,则会添加新列。
|
|
连接的一个有用的快捷方式是在Series和DataFrame实例的append
方法。这些方法实际上早于concat()
方法。 它们沿axis=0
连接,即索引 -
|
|
append()
函数也可以带多个对象
|
|
时间序列
Pandas为时间序列数据的工作时间提供了一个强大的工具,尤其是在金融领域。在处理时间序列数据时,我们经常遇到以下情况 -
- 生成时间序列
- 将时间序列转换为不同的频率
获取当前时间
datetime.now()
用于获取当前的日期和时间。
|
|
创建时间戳
时间戳数据是时间序列数据的最基本类型,它将数值与时间点相关联。 对于Pandas对象来说,意味着使用时间点。
|
|
创建时间范围
|
|
改变时间频率
|
|
Pandas分类数据
分类对象创建
通过在pandas
对象创建中将dtype
指定为“category”
。
|
|
传递给系列对象的元素数量是四个,但类别只有三个。观察相同的输出类别。
使用标准Pandas分类构造函数,我们可以创建一个类别对象。
|
|
|
|
- 第二个参数表示类别。因此,在类别中不存在的任何值将被视为
NaN
- 从逻辑上讲,排序(ordered)意味着,
a
大于b
,b
大于c
。
Describe()
|
|
Pandas可视化
线形图
|
|
如果索引由日期组成,则调用
gct().autofmt_xdate()
来格式化x
轴,如上图所示。我们可以使用
x
和y
关键字绘制一列与另一列。
条形图
|
|
要生成一个堆积条形图,通过指定:pass stacked=True
|
|
要获得水平条形图,使用barh()
方法
|
|
直方图
可以使用plot.hist()
方法绘制直方图。我们可以指定bins
的数量值。
|
|
要为每列绘制不同的直方图
|
|
箱线图
基本绘图:绘图
Series和DataFrame上的这个功能只是使用matplotlib
库的plot()
方法的简单包装实现。参考以下示例代码 -
|
|
执行上面示例代码,得到以下结果 -
如果索引由日期组成,则调用gct().autofmt_xdate()
来格式化x
轴,如上图所示。
我们可以使用x
和y
关键字绘制一列与另一列。
绘图方法允许除默认线图之外的少数绘图样式。 这些方法可以作为plot()
的kind
关键字参数提供。这些包括 -
bar
或barh
为条形hist
为直方图boxplot
为盒型图area
为“面积”scatter
为散点图
条形图
现在通过创建一个条形图来看看条形图是什么。条形图可以通过以下方式来创建 -
|
|
执行上面示例代码,得到以下结果 -
要生成一个堆积条形图,通过指定:pass stacked=True -
|
|
执行上面示例代码,得到以下结果 -
要获得水平条形图,使用barh()
方法 -
|
|
执行上面示例代码,得到以下结果 -
直方图
可以使用plot.hist()
方法绘制直方图。我们可以指定bins
的数量值。
|
|
执行上面示例代码,得到以下结果 -
要为每列绘制不同的直方图,请使用以下代码 -
|
|
执行上面示例代码,得到以下结果 -
箱形图
Boxplot可以绘制调用Series.box.plot()
和DataFrame.box.plot()
或DataFrame.boxplot()
来可视化每列中值的分布。
|
|
这里是一个箱形图,表示对
[0,1)
上的统一随机变量的10
次观察的五次试验。
散点图
|
|
饼状图
|
|
IO工具
Pandas I/O API是一套像pd.read_csv()
一样返回Pandas
对象的顶级读取器函数。
读取文本文件(或平面文件)的两个主要功能是read_csv()
和read_table()
。它们都使用相同的解析代码来智能地将表格数据转换为DataFrame
对象
|
|
read_csv()
read.csv
从csv文件中读取数据并创建一个DataFrame
对象。
|
|
自定义索引
可以指定csv文件中的一列来使用index_col
定制索引。
|
|
类型转换器
|
|
指定列名
使用names
参数指定标题的名称。
|
|
观察可以看到,标题名称附加了自定义名称,但文件中的标题还没有被消除。 现在,使用header
参数来删除它。
如果标题不是第一行,则将行号传递给标题。这将跳过前面的行。
|
|
skiprows
skiprows
跳过指定的行数
|
|
Pandas稀疏数据
当任何匹配特定值的数据(NaN/缺失值,尽管可以选择任何值)被省略时,稀疏对象被“压缩”。 一个特殊的SparseIndex对象跟踪数据被“稀疏”的地方。 这将在一个例子中更有意义。 所有的标准Pandas数据结构都应用了to_sparse
方法
|
|
为了内存效率的原因,所以需要稀疏对象的存在。
现在假设有一个大的NA DataFrame并执行下面的代码
|
|
通过调用to_dense
可以将任何稀疏对象转换回标准密集形式
|
|
稀疏Dtypes
稀疏数据应该具有与其密集表示相同的dtype。 目前,支持float64
,int64
和booldtypes
。 取决于原始的dtype
,fill_value
默认值的更改 -
float64
−np.nan
int64
−0
bool
−False
|
|
按位布尔
按位布尔运算符(如==
和!=
)将返回一个布尔系列
|
|
isin()
这将返回一个布尔序列,显示系列中的每个元素是否完全包含在传递的值序列中
|
|