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()即可显示地复制列