Pandas
什么是Pandas?
基于 NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。
与Numpy的区别?
Pandas是专门为处理表格和混杂数据设计的
NumPy更适合处理统一的数值数组数据
数据结构
Pandas中的主要数据结构有两个:Series
和DataFrame
Series是一种类似于一维数组(Python中的list)的对象,由一组数据和一组索引(下标)两部分组成。Series可以保存任何数据类型。
DataFrame是一个二维的表格型数据结构,可以把它想象成是一个Excel表格来理解,既有行索引,也有列索引。其中每列可以是不同的值类型。
Index也是比较常见的数据结构,虽然没有前两者那么重要,但也是必不可少的。
创建数据结构对象
Series
初步
由相同元素类型构成的一维数据结构
具有列表和字典的特点
In [1]:
In [2]:
Out[2]:
In [3]:
Out[3]:
In [4]:
In [5]:
Out[5]:
In [6]:
Out[6]:
创建
无索引创建
data为ndarray或list,则其缺少Series需要索引信息
提供index,必须与data长度相同
若不提供,则Series会自动生成默认数值索引range(0,data.shape[0])
In [7]:
In [8]:
Out[8]:
In [9]:
Out[9]:
In [10]:
Out[10]:
有索引创建
如果 data 为 Series 或 dict ,那么其已经提供了 Series 需要的索引信息,所以 index 项是不需要提供的
如果额外提供了 index 项,那么其将对当前构建的Series进行覆盖
In [11]:
In [12]:
Out[12]:
In [13]:
In [14]:
Out[14]:
DataFrame
初步
具有共同索引的Series按排列构成(二维矩阵)
类似于Excel表格
In [15]:
Out[15]:
a
1
2
3
b
4
5
6
In [16]:
Out[16]:
In [17]:
Out[17]:
In [18]:
Out[18]:
In [19]:
Out[19]:
In [20]:
Out[20]:
创建
函数由多个参数,主要参数:data,index和columns
data无行索引、无列索引
如果 data 为 ndarray(2D) or list(2D),那么其缺少 DataFrame 需要的行、列索引信息
如果提供 index 或 columns 项,其必须和data的行 或 列长度相同
如果不提供 index 或 columns 项,那么其将默认生成数值索引range(0, data.shape[0])) 或 range(0, data.shape[1])。
In [21]:
Out[21]:
a
1
2
3
b
4
5
6
data无 行索引,有 列索引
如果data为 dict of ndarray(1D) or list(1D),所有ndarray或list的长度必须相同。且dict的key为DataFrame提供了需要的columns信息,缺失index
如果提供 index 项,必须和list的长度相同
如果不提供 index,那么其将默认生成数值索引range(0, data.shape[0]))
如果还额外提供了columns项,那么其将对当前构建的DataFrame进行 列重索引
In [22]:
Out[22]:
0
1
4
6
1
4
5
7
In [23]:
Out[23]:
0
1
4
6
1
4
5
7
data有 行索引,有 列索引
如果data为 dict of Series or dict,那么其已经提供了DataFrame需要的所有信息
如果多个Series或dict间的索引不一致,那么取并操作(pandas不会试图丢掉信息),缺失的数据填充NaN
如果提供了index项或columns项,那么其将对当前构建的DataFrame进行 重索引(reindex,pandas内部调用接口)
In [24]:
Out[24]:
a
1.0
4.0
6.0
b
4.0
5.0
NaN
c
NaN
NaN
7.0
In [25]:
Out[25]:
a
1.0
4.0
7.0
b
2.0
5.0
NaN
NaN
NaN
8.0
读取文件
CSV文件
filepath_or_buffer:路径和文件名不要带中文,带中文容易报错
sep: csv文件数据的分隔符,默认是',',根据实际情况修改
header:如果有列名,那么这一项不用改
names:如果没有列名,那么必须设置header = None, names为列名的列表,不设置默认生成数值索引
index_col:int型,选取这一列作为索引
encoding:根据你的文档编码来确定,如果有中文读取报错,试试encoding = 'gbk'
这里采用手动创建数据
Out[1]:
0
Bob
968
1
Jessica
155
2
Mary
77
3
John
578
4
Mel
973
导出数据为csv格式
将这两个参数设置为
False
将会防止索引(index)和列名(header names)被导出到文件中
In [2]:
导入csv数据
In [3]:
Out[3]:
0
Jessica
155
1
Mary
77
2
John
578
3
Mel
973
会发现列名不正确,是错误的,需要进行调整,将header设置为None即可,想要设置自定义列名,需要通过names参数进行设置
In [4]:
Out[4]:
0
Bob
968
1
Jessica
155
2
Mary
77
3
John
578
4
Mel
973
In [5]:
Out[5]:
0
Bob
968
1
Jessica
155
2
Mary
77
3
John
578
4
Mel
973
Excel文件
io:文件地址
sheetname:表格的sheet窗口名称
header:如果有列名,那么这一项不用改;
names:如果没有列名,那么必须设置header = None, names为列名的列表,不设置默认生成数值索引;
index_col:int型,选取这一列作为索引。
导出数据为xls格式
用法与to_csv类似
注意运用index,header参数去掉索引和列名
In [6]:
导入excel数据
In [7]:
Out[7]:
0
Bob
968
1
Jessica
155
2
Mary
77
3
John
578
4
Mel
973
增删查改
Series
In[1]:
Out[1]:
通过索引与切片进行查询
In [2]:
Out[2]:
In [3]:
Out[3]:
In [4]:
Out[4]:
In [5]:
Out[5]:
In [6]:
Out[6]:
In [7]:
Out[7]:
通过iloc与loc进行查询
loc查询方式与上述相同
iloc查询无视索引,只根据位置定位
基于索引--loc
In [8]:
Out[8]:
In [9]:
Out[9]:
In [10]:
Out[10]:
In [11]:
Out[11]:
基于位置--iloc
In [12]:
Out[12]:
In [13]:
Out[13]:
In [14]:
Out[14]:
In [15]:
Out[15]:
In [16]:
Out[16]:
修改数值
直接赋值
In[1]:
Out[1]:
In [2]:
Out[2]:
In [3]:
Out[3]:
通过replace函数修改
to_replace:要修改的值,可以为列表
value:改为的值,可以为列表,与to_repalce要匹配
inplace:是否在原地修改
In [5]:
Out[5]:
In [6]:
Out[6]:
修改索引
通过index进行修改
In [7]:
Out[7]:
通过rename函数修改
index:list or dict,list时必须和已有索引长度相同,dict可以部分修改
level:多重索引时,可以指定修改哪一重,从0开始递增
inplace:是否原地修改
In [9]:
Out[9]:
添加数据
增加一行
In [10]:
Out[10]:
增加多行
to_append: 另一个series或多个Series构成的列表;
ignore_index:False-保留原有索引,True-清除所有索引,生成默认数值索引;
verify_integrity:True的情况下,如果to_append索引与当前索引有重复,则报错。
In [11]:
Out[11]:
删除数据
删除一行数据
In [14]:
Out[14]:
删除多行数据
labels:索引,单索引或索引的列表;
level:多重索引需要设置;
inplace:是否本地修改。
In [15]:
Out[15]:
DataFrame
In[1]:
Out[1]:
a
1
2
3
b
4
5
6
##### 通过索引与切片进行查询
通过列索引--查询单个值
In [2]:
Out[2]:
通过列索引--查询多个值
In [3]:
Out[3]:
a
1
3
b
4
6
查询第几行--行范围
In [4]:
Out[4]:
a
1
2
3
通过布尔值,返回需要的行
In [5]:
Out[5]:
b
4
5
6
通过行索引查询
In [6]:
Out[6]:
a
1
2
3
b
4
5
6
通过条件筛选查询
In [7]:
Out[7]:
a
NaN
NaN
NaN
b
NaN
5.0
6.0
基于索引查询--loc
查询单值
In [9]:
Out[9]:
查询多值,通过行索引以及列索引筛选需要的值
In [10]:
Out[10]:
In [11]:
Out[11]:
In [12]:
Out[12]:
In [13]:
Out[13]:
基于位置查询--iloc
查询单个值
In [14]:
Out[14]:
a
1
2
3
b
4
5
6
In [15]:
Out[15]:
In [16]:
Out[16]:
查询多个值:第一个参数为行,第二个参数为列,均可为列表
In [20]:
Out[20]:
a
2
3
b
5
6
修改数值
直接修改
In [18]:
Out[18]:
a
1000
2
3
b
4
5
6
通过replace修改
to_replace:要修改的值,可以为列表
value:改为的值,可以为列表,与to_repalce要匹配
inplace:是否在原地修改
In [19]:
Out[19]:
ABCa
5555
2
3
b
4
5
6
交换行列
In [20]:
Out[20]:
a
2
1000
3
b
5
4
6
修改索引
直接修改行索引index,列索引columns
In [21]:
Out[21]:
a
1
2
3
b
4
5
6
In [22]:
Out[22]:
c
1
2
3
d
4
5
6
通过rename函数进行修改
In [24]:
Out[24]:
t
1
2
3
d
4
5
6
添加行数据
添加一行数据
In [25]:
Out[25]:
a
1
2
3
b
4
5
6
j
7
8
9
添加多行数据
确保 列索引 相同,行增加。 (其实这个函数并不要求列索引相同,它可以选择出相同的列。而我写这个教程遵循了python的宣言—明确:做好一件事有一种最好的方法,精确控制每一步,可以少犯错。)
objs: list of DataFrame;
axis: 取0,进行行增加操作。
In [26]:
Out[26]:
a
1
2
3
b
4
5
6
c
7
8
9
d
7
8
9
添加列数据
添加一列数据
In [27]:
Out[27]:
a
1
2
3
b
4
5
6
In [28]:
Out[28]:
a
1
2
3
4
b
4
5
6
7
添加多列数据
In [29]:
Out[29]:
a
1
2
3
4
11
12
b
4
5
6
7
14
15
删除数据
删除多行数据
labels:索引,单索引或索引的列表;
axis:0-删行;
level:多重索引需要指定;
inplace:是否本地修改。
In[30]:
Out[30]:
a
1
2
3
b
4
5
6
In [33]:
Out[33]:
b
4
5
6
删除一列删除
In [32]:
Out[32]:
a
2
3
b
5
6
删除多列数据
labels:索引,单索引或索引的列表;
axis:1-删列;
level:多重索引需要指定;
inplace:是否本地修改。
In [33]:
Out[33]:
a
2
b
5
In [34]:
Out[34]:
a
2
b
5
合并数据
merge()
concat函数本质上是在所有索引上同时进行对齐合并,而如果想在任意列上对齐合并,则需要merge函数,其在sql应用很多。
left,right: 两个要对齐合并的DataFrame;
how: 先做笛卡尔积操作,然后按照要求,保留需要的,缺失的数据填充NaN;
left: 以左DataFrame为基准,即左侧DataFrame的数据全部保留(不代表完全一致、可能会存在复制),保持原序
right: 以右DataFrame为基准,保持原序
inner: 交,保留左右DataFrame在on上完全一致的行,保持左DataFrame顺序
outer: 并,按照字典顺序重新排序
on:列索引或列索引列表,如果要在DataFrame相同的列索引做对齐,用这个参数;
left_on, right_on, left_index, right_index:
on对应普通的列索引或列索引列表,对齐不同列名的DataFrame,用这俩参数;
index对应要使用的index,建议不要使用这俩参数,因为可以用concat方法代替。
sort: True or False,是否按字典序重新排序。
1.初步
In [1]:
In [2]:
Out[2]:
a
1
2
b
3
4
In [3]:
Out[3]:
b
1
3
d
4
7
如果单纯的按照index对齐,不如用concat方法,所以一般不建议使用left_index, right_index
In [4]:
Out[4]:
0
1
2
1
3
In [5]:
Out[5]:
b
3
4
1
3
2.on用法
设置how='inner'
In [6]:
Out[6]:
0
3
4
7
In [7]:
Out[7]:
0
3
4
1
3
3.how用法
In [8]:
Out[8]:
0
1
2
NaN
1
3
4
7.0
In [9]:
Out[9]:
0
3.0
4
7
1
NaN
1
3
对齐的列存在重复值
In [10]:
Out[10]:
a
1
4
b
3
4
In [11]:
Out[11]:
b
1
3
d
4
7
In [12]:
Out[12]:
0
1.0
4
7
1
3.0
4
7
2
NaN
1
3
concat()详解
1.初步
In [13]:
In [14]:
Out[14]:
In [15]:
Out[15]:
a
1.0
NaN
NaN
b
2.0
NaN
NaN
c
3.0
NaN
NaN
e
NaN
4.0
NaN
f
NaN
5.0
NaN
g
NaN
6.0
NaN
h
NaN
NaN
7.0
i
NaN
NaN
8.0
j
NaN
NaN
9.0
普通列和行index的相互转化
字符串处理
查看信息
info
verbose:True or False,字面意思是冗长的,也就说如果DataFrame有很多列,是否显示所有列的信息,如果为否,那么会省略一部分;
memory_usage:True or False,默认为True,是否查看DataFrame的内存使用情况;
null_counts:True or False,默认为True,是否统计NaN值的个数。
ndim、shape、size
查看维数,形状,元素个数
head、tail
默认分别查看头5行和后5行。
memory_usage
index:是否显示索引占用的内存,毫无疑问索引也占用内存;
deep:是否显示object类型的列消耗的系统资源,由于pandas中object元素只是一个引用,我估计这个deep是指显示真实的内存占用。
describe
快速查看每一列的统计信息,默认排除所有NaN元素
include:'all'或者[np.number 或 np.object]。numberic只对元素属性为数值的列做数值统计,object只对元素属性为object的列做类字符串统计。
数值运算
与数据库进行交互
最后更新于
这有帮助吗?