pandas基础--数据结构:DataFrame

从本文开始介绍pandas的相关知识。

pandas含有是数据分析工作变得更快更简单的高级数据结构和操作工具,是基于numpy构建的。

本章节的代码引入pandas约定为:import pandas as pd,另外import numpy as np也会用到。

官方介绍:pandas - Python Data Analysis Library (pydata.org)

pandas数据结构介绍:主要有两种:Series和DataFrame。本文对DataFrame进行简单介绍。

2 DataFrame介绍

官方文档:DataFrame — pandas 1.3.4 documentation (pydata.org)

DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等)。DataFrame既可以行索引也可以列索引,它可以被看作由Series组成的字典(共用同一个索引)。DataFrame中的数据是以一个或多个二维块存放的(而不是列表、字典或别的一维数据结构)。

2.1 构建DataFrame

最常见的一种是直接传入一个等长列表或NumPy数组组成的字典,DataFrame会自动加上索引(和Series一样),且全部列会被有序排列。如果指定了列序列,就会按照指定顺序进行排列,如果传入的列在数据中找不到,就会产生NaN值。

 1 >>> data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'], 'year': [2000, 2001, 2002, 2001, 2002], 'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
 2 >>> frame = pd.DataFrame(data)                           
 3 >>> frame
 4     state  year  pop
 5 0    Ohio  2000  1.5
 6 1    Ohio  2001  1.7
 7 2    Ohio  2002  3.6
 8 3  Nevada  2001  2.4
 9 4  Nevada  2002  2.9
10 >>> pd.DataFrame(data, columns=['year', 'state', 'pop'])  #指定列序列
11    year   state  pop
12 0  2000    Ohio  1.5
13 1  2001    Ohio  1.7
14 2  2002    Ohio  3.6
15 3  2001  Nevada  2.4
16 4  2002  Nevada  2.9
17 >>> frame2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'], index=['one', 'two', 'three', 'four', 'five'])
19 >>> frame2
20        year   state  pop debt
21 one    2000    Ohio  1.5  NaN
22 two    2001    Ohio  1.7  NaN
23 three  2002    Ohio  3.6  NaN
24 four   2001  Nevada  2.4  NaN
25 five   2002  Nevada  2.9  NaN
26 >>>

另一种常见的数据形式是嵌套字典(也就是字典的字典)。外层字典的键作为列,内层键则作为行索引。内层字典的键会被合并、排序以形成最终的索引。

 1 >>> pop = {'Nevada': {2001: 2.4, 2002:2.9}, 'Ohio':{2000: 1.5, 2001: 1.7, 2002: 3.6}}
 2 >>> frame3 = pd.DataFrame(pop) 
 3 >>> frame3
 4       Nevada  Ohio
 5 2001     2.4   1.7
 6 2002     2.9   3.6
 7 2000     NaN   1.5
 8 >>> frame3.T  #可以进行转置
 9         2001  2002  2000
10 Nevada   2.4   2.9   NaN
11 Ohio     1.7   3.6   1.5
12 >>> pd.DataFrame(pop, index=[2001, 2002, 2003])  #显示指定索引
13       Nevada  Ohio
14 2001     2.4   1.7
15 2002     2.9   3.6
16 2003     NaN   NaN
17 >>>

下表是DataFrame构造函数所能接受的各种数据。

类型 说明
二维ndarray 数据矩阵,还可以传入行标和列标
由数组、列表或元组组成的字典 每个序列会变成Datarame的一列,所有序列的长度必须相同。
NumPy的结构化/记录数组 类似于“由数组组成的字典”
由Series组成的字典 每个Series会称为一列,如果没有显示指定索引,则各Series的索引会被合并成结果的行索引。
由字典组成的字典 各内层字典会成为一列,键会被合并成结果的行索引,跟“由Series组成的字典”的情况一样。
字典或Series的列表 各项将会成为DataFrame的一行,字典键或Series索引的并集将会成为DataFrame的列标。
由列表或元组组成的列表 类似于“二维ndarray”
另一个DataFrame 该DataFrame的索引将被沿用,除非显示指定了其他索引
NumPy的MaskedArray 类似于“二维ndarray”的情况,知识掩码值在结果DataFrame会变成Na/缺省值。

2.2 获取值

通过字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series。返回的Series拥有原DataFrame相同的索引,且其name属性已经被相应的设置好了。

 1 >>> frame2
 2        year   state  pop debt
 3 one    2000    Ohio  1.5  NaN
 4 two    2001    Ohio  1.7  NaN
 5 three  2002    Ohio  3.6  NaN
 6 four   2001  Nevada  2.4  NaN
 7 five   2002  Nevada  2.9  NaN
 8 >>> frame2['state'] 
 9 one        Ohio
10 two        Ohio
11 three      Ohio
12 four     Nevada
13 five     Nevada
14 Name: state, dtype: object
15 >>> frame2.year    
16 one      2000
17 two      2001
18 three    2002
19 four     2001
20 five     2002
21 Name: year, dtype: int64

2.3 赋值

列可以通过赋值的方式进行修改。

 1 >>> frame2
 2        year   state  pop debt
 3 one    2000    Ohio  1.5  NaN
 4 two    2001    Ohio  1.7  NaN
 5 three  2002    Ohio  3.6  NaN
 6 four   2001  Nevada  2.4  NaN
 7 five   2002  Nevada  2.9  NaN
 8 >>> frame2['debt'] = 16.5
 9 >>> frame2
10        year   state  pop  debt
11 one    2000    Ohio  1.5  16.5
12 two    2001    Ohio  1.7  16.5
13 three  2002    Ohio  3.6  16.5
14 four   2001  Nevada  2.4  16.5
15 five   2002  Nevada  2.9  16.5
16 >>> frame2['debt'] = np.arange(5) 
17 >>> frame2
18        year   state  pop  debt
19 one    2000    Ohio  1.5     0
20 two    2001    Ohio  1.7     1
21 three  2002    Ohio  3.6     2
22 four   2001  Nevada  2.4     3
23 five   2002  Nevada  2.9     4
24 >>>

将列表或数组赋值给某个列时,其长度必须跟DataFrame的长度相匹配,如果赋值的是一个Series,就会精确匹配DataFrame的索引,所有的空位都将被填上缺失值。

 1 >>> frame2
 2        year   state  pop  debt
 3 one    2000    Ohio  1.5     0
 4 two    2001    Ohio  1.7     1
 5 three  2002    Ohio  3.6     2
 6 four   2001  Nevada  2.4     3
 7 five   2002  Nevada  2.9     4
 8 >>> val = pd.Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])
 9 >>> frame2.debt = val 
10 >>> frame2
11        year   state  pop  debt
12 one    2000    Ohio  1.5   NaN
13 two    2001    Ohio  1.7  -1.2
14 three  2002    Ohio  3.6   NaN
15 four   2001  Nevada  2.4  -1.5
16 five   2002  Nevada  2.9  -1.7
17 >>>

为不存在的列赋值会创建一个新列,关键字del用于删除列:

 1 >>> frame2 
 2        year   state  pop  debt
 3 one    2000    Ohio  1.5   NaN
 4 two    2001    Ohio  1.7  -1.2
 5 three  2002    Ohio  3.6   NaN
 6 four   2001  Nevada  2.4  -1.5
 7 five   2002  Nevada  2.9  -1.7
 8 >>> frame2['eastern'] = frame2.state == 'Ohio' 
 9 >>> frame2 
10        year   state  pop  debt  eastern
11 one    2000    Ohio  1.5   NaN     True
12 two    2001    Ohio  1.7  -1.2     True
13 three  2002    Ohio  3.6   NaN     True
14 four   2001  Nevada  2.4  -1.5    False
15 five   2002  Nevada  2.9  -1.7    False
16 >>> del frame2['eastern']
17 >>> frame2.columns
18 Index(['year', 'state', 'pop', 'debt'], dtype='object')
19 >>>

2.4 其他

如果设置了DataFrame的index和columns的name属性。这些信息也会被显示出来。

 1 >>> frame3
 2       Nevada  Ohio
 3 2001     2.4   1.7
 4 2002     2.9   3.6
 5 2000     NaN   1.5
 6 >>> frame3.index.name = 'year' 
 7 >>> frame3.columns.name = 'state'
 8 >>> frame3
 9 state  Nevada  Ohio
10 year
11 2001      2.4   1.7
12 2002      2.9   3.6
13 2000      NaN   1.5
14 >>> frame3.values
15 array([[2.4, 1.7],
16        [2.9, 3.6],
17        [nan, 1.5]])
18 >>>
posted @ 2020-02-02 15:32  zhengcixi  阅读(425)  评论(0编辑  收藏  举报
回到顶部