Pandas的数据结构
前言
基本上, Pandas
的Series
沿袭了Numpy
的设计, 是一维数组和数组的索引, 和Numpy
不同的一点是这个一维数组可以是异构的,比如数字int和字符串混在一起, 这个时候数组的类型是object
. 而DataFrame
是为了处理表格和异构多维的数据.
Series
可以用python的list
初始化一个Series
, 也可以用python的Dict
初始化一个Series
. 如果使用Dict
那么序列的索引就是Dict
的Key
.
1 | 'd': 1, 'e':2, 'a':0} d = { |
想要得到自己想要的顺序可以使用参数index
排序Series
, 下图的例子可以看到索引b
, 但是它没有值会用NaN
表示(可以使用isnull
, notnull
检测是否为空), 没有索引的值会被省略.
1 | 'e','b','d']) pd.Series(d, index=[ |
Pandas
筛选比较强大的一点是直接可以在[]输入条件, 这点可能和python本身的语法有一点不同.
1 | obj2= pd.Series(d) |
两个Series
是可以直接通过索引直接做计算的, 类似数据库的join
. 计算子必须都需要有相同的索引才会有计算结果, 否则会出现NaN
.
1 | In [35]: obj3 |
可以给Series
起一个名字, 使用Series.name
属性, 取个名字的好处是如果把Series
放入Dataframe
, 那么这个name
就是Dataframe
的列名.(DataFrame
也会有index
名称和column
名称)
1 | In [1]: s = pd.Series(["A","B","C"], name="foo") |
DataFrame
Pandas
的DataFrame
代表了一组表格(一般是二维, 可以使用hierarchical indexing
来表示更高的维度数组), 数据的底层存储如下图所示, 数据会按类型分成不同的块存储实际的数据. 可以看到数据被没有指向具体的列, 而是通过BlockManager
这个类是来管理实际数据到列名的映射.
有很多种方式构建DataFrame
, 常见的一种是通过Dict
; 如果想在创建的时候指定索引, 可以使用嵌入式dict
.
1 | In [44]: data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'], |
下图是所有的输入数据类型可以构建DataFrame
:
DataFrame
可以指定column
参数选择只要某几列, 也可以在column
任意添加列名, 如何column
这个字段赋予了不存在的列, 那么新加的这个列会显示NaN
. 两者的区别在于使用属性访问时, 这个python的attribute
必须符合python的规则.
1 | 'pop','jik']) pd.DataFrame(data, columns=[ |
想要取得DataFrame
的某个列, 可以采用.columnName
或切片的方式:
1 | In [51]: frame2['state'] |
通过DataFrame.loc[]
可以选取某几行, 这个loc
用的是[] ,而不是(), 和python的语法又有些区别. 一般使用loc[]
定位字符串(label)索引, iloc[]
定位数字(number)索引.
1 | 3] frame.iloc[ |
可以使用Series
给DataFrame
赋值, Series
将成为DataFrame
的一个列, 列值必须和DataFrame
的长度一致, 缺失的值将会NaN
.
1 | 1.2, -1.5, -1.9], index=['two','four','five']) val = pd.Series([- |
DateFrame
列赋值还有一个快捷判断的语法, 可以一行代码先判断再赋值
1 | 'new_col'] = frame2.state == 'Ohio' frame2[ |
列的删除: 使用del df[clo]
DataFrame
的values
属性会返回一个二维ndarray
的数组.
1 | frame3.values |
Index对象
Index
对象负责存储轴标签axis label
和其它元信息如索引名称, 任何数组或其它序列的标签在转化成Series
或DataFrame
的时候会被转成Index
.
1 | 3)) lables = pd.Index(np.arange( |
pandas
的索引对象是不可变的, 既可以把index
当成数组, 可以当成集合, 注意这个集合不同于python的set
, 集合是可以重复的.
1 | 'foo','foo','bar']) dup_index = pd.Index([ |
Index
对象的一些常用方法:
- Post title:Pandas的数据结构
- Post author:Kopei
- Create time:2018-09-16 00:00:00
- Post link:https://kopei.github.io/2018/09/15/python-2018-09-16-pandas的数据结构/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.