DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等)。DataFrame既可以行索引也可以列索引,它可以被看作由Series组成的字典(共用同一个索引)。DataFrame中的数据是以一个或多个二维块存放的(而不是列表、字典或别的一维数据结构)。
(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', 18 '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)获取值
通过字典标记的方式或属性的方式,可以将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
(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 >>>
(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 >>>