DataFrame

DataFrame是一个表格型的数据结构,含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等),DataFrame就行索引也有列索引,可以被看做由Series组成的字典(共用同一个索引)。跟其他类似的数据结构相比,DataFrame中面向行和面向列的操作基本上是平衡的。

构建DataFrame的方法有很多,最常用的一种是直接传入一个由等长列表或Numpy数组组成的字典。

结果DataFrame会自动加上索引,且全部列会被有序排列。

 1 In [10]: import pandas as ps
 2 
 3 In [11]: from pandas import DataFrame
 4 
 5 In [12]: data = {'state':['simple','simple','Python','Python'],'year':['2017','2
 6     ...: 018','2019','2020'],'pop':['1','2','3','4']}
 7 
 8 In [13]: frame = DataFrame(data)
 9 
10 In [14]: frame
11 Out[14]: 
12   pop   state  year
13 0   1  simple  2017
14 1   2  simple  2018
15 2   3  Python  2019
16 3   4  Python  2020

如果指定列顺序,DataFrame的列就会按照指定顺序进行排列。

1 In [15]: DataFrame(data,columns=['year','state','pop'])
2 Out[15]: 
3    year   state pop
4 0  2017  simple   1
5 1  2018  simple   2
6 2  2019  Python   3
7 3  2020  Python   4

与Series一样,如果传入的列在数据中找不到,就会产生NA值。

 1 In [17]: frame2 = DataFrame(data,columns=['year','state','pop','debt'],index=['o
 2     ...: ne','two','three','four'])
 3 
 4 In [18]: frame2
 5 Out[18]: 
 6        year   state pop debt
 7 one    2017  simple   1  NaN
 8 two    2018  simple   2  NaN
 9 three  2019  Python   3  NaN
10 four   2020  Python   4  NaN
11 
12 In [19]: frame2.columns
13 Out[19]: Index([u'year', u'state', u'pop', u'debt'], dtype='object')

通过类似字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series。

 1 In [20]: frame2['state']
 2 Out[20]: 
 3 one      simple
 4 two      simple
 5 three    Python
 6 four     Python
 7 Name: state, dtype: object
 8 
 9 In [21]: frame2.year
10 Out[21]: 
11 one      2017
12 two      2018
13 three    2019
14 four     2020
15 Name: year, dtype: object

返回的Series拥有原DataFrame相同的索引,且其name属性也已经被相应地设置好了。行也可以通过位置或名称的方式进行获取,用索引字段ix

1 In [23]: frame2.ix['three']
2 Out[23]: 
3 year       2019
4 state    Python
5 pop           3
6 debt        NaN
7 Name: three, dtype: object

列可以通过赋值的方式进行修改,给空的‘debt’列附上一个标量值或一组值。

1 In [24]: frame2['debt'] = '10'
2 
3 In [25]: frame2
4 Out[25]: 
5        year   state pop debt
6 one    2017  simple   1   10
7 two    2018  simple   2   10
8 three  2019  Python   3   10
9 four   2020  Python   4   10

通过np.arange()为‘debt’列赋值

1 In [29]: frame2['debt'] = np.arange(4.)
2 
3 In [30]: frame2
4 Out[30]: 
5        year   state pop  debt
6 one    2017  simple   1   0.0
7 two    2018  simple   2   1.0
8 three  2019  Python   3   2.0
9 four   2020  Python   4   3.0

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

 1 1 In [32]:  val = Series([1,3,4],index=['one','three','four'])
 2  2 
 3  3 In [33]: frame2['debt'] = val
 4  4 
 5  5 In [34]: frame2
 6  6 Out[34]: 
 7  7        year   state pop  debt
 8  8 one    2017  simple   1   1.0
 9  9 two    2018  simple   2   NaN
10 10 three  2019  Python   3   3.0
11 11 four   2020  Python   4   4.0

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

 1 In [35]: frame2['eastern'] = frame2.state=='simple'
 2 
 3 In [36]: frame2
 4 Out[36]: 
 5        year   state pop  debt  eastern
 6 one    2017  simple   1   1.0     True
 7 two    2018  simple   2   NaN     True
 8 three  2019  Python   3   3.0    False
 9 four   2020  Python   4   4.0    False
10 
11 In [37]: del frame2['eastern']
12 
13 In [38]: frame2.columns
14 Out[38]: Index([u'year', u'state', u'pop', u'debt'], dtype='object')

通过索引方式返回的列知识相应数据的视图,并不是副本。因此,对返回的Series所做的任何就地修改全都会反应到源DataFrame上。通过Series的copy()即可显示地复制列

posted @ 2017-11-24 16:58  薛乔毓  阅读(700)  评论(0编辑  收藏  举报