1. 什么是DataFrame
DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,它可以被看做由series组成的字典(共用同一个索引)
2. DateFrame特点
DataFrame中面向行和面向列的操作基本是平衡的。
DataFrame中的数据是以一个或多个两维块存放的(而不是列表、字典或别的一维数据结构)。
3. 创建DataFrame
最常用的一种是直接传入一个由等长列表或NumPy数组组成的字典:
In [33]: data={'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],'year':[2000,2001,2002,2001,2002],'pop':[1.5,1.7,3.6,2.4,2.9]}
In [34]: frame=DataFrame(data)
#结果DataFrame会自动加上索引(跟Series一样),且全部列会被有序排列:
In [35]: frame
Out[35]:
pop state year
0 1.5 Ohio 2000
1 1.7 Ohio 2001
2 3.6 Ohio 2002
3 2.4 Nevada 2001
4 2.9 Nevada 2002
4. 指定列顺序
#使用clolumns指定列顺序
In [36]: DataFrame(data,columns=['year','state','pop'])
Out[36]:
year state pop
0 2000 Ohio 1.5
1 2001 Ohio 1.7
2 2002 Ohio 3.6
3 2001 Nevada 2.4
4 2002 Nevada 2.9
5. NA值
跟Series一样,如果传入的列在数据中找不到,就会产生NA值:
In [37]: DataFrame(data,columns=['year','state','pop','debt'],index=['one','two','three','four','five'])
Out[37]:
year state pop debt
one 2000 Ohio 1.5 NaN
two 2001 Ohio 1.7 NaN
three 2002 Ohio 3.6 NaN
four 2001 Nevada 2.4 NaN
five 2002 Nevada 2.9 NaN
6. 类似字典(或属性)标记
通过类似字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series:
In [39]: frame['state'] #或frame.state
Out[39]:
0 Ohio
1 Ohio
2 Ohio
3 Nevada
4 Nevada
Name: state, dtype: object
7. 索引字段ix(行)
注意,返回的Series拥有原DataFrame相同的索引,且其name属性也已经被相应地设置好了。行也可以通过位置或名称的方式进行获取,比如用索引字段ix:
In [44]: frame2.ix['one']
Out[44]:
year 2000
state Ohio
pop 1.5
debt NaN
Name: one, dtype: object
8. 通过赋值修改列
列可以通过赋值的方式进行修改。例如,可以给那个空的‘debt’列赋上一个标量值或一组值:
In [45]: frame2['debt']=16.5 #或frame2.debt
In [46]: frame2
Out[46]:
year state pop debt
one 2000 Ohio 1.5 16.5
two 2001 Ohio 1.7 16.5
three 2002 Ohio 3.6 16.5
four 2001 Nevada 2.4 16.5
five 2002 Nevada 2.9 16.5
In [50]: frame2.debt=np.arange(5.)
In [51]: frame2
Out[51]:
year state pop debt
one 2000 Ohio 1.5 0.0
two 2001 Ohio 1.7 1.0
three 2002 Ohio 3.6 2.0
four 2001 Nevada 2.4 3.0
five 2002 Nevada 2.9 4.0
将列表或数组赋值给某个列时,其长度必须跟DataFrame的长度相匹配。如果赋值的是一个Series,就会精确匹配DataFrame的索引,所有的空位都将被填上缺失值:
In [52]: val=Series([-1.2,-1.5,-1.7],index=['two','four','five'])
In [53]: frame2['debt']=val
In [54]: frame2
Out[54]:
year state pop debt
one 2000 Ohio 1.5 NaN
two 2001 Ohio 1.7 -1.2
three 2002 Ohio 3.6 NaN
four 2001 Nevada 2.4 -1.5
five 2002 Nevada 2.9 -1.7
9. 关键字del删除列
为不存在的列赋值会创建出一个新列。关键字del用于删除列:
In [55]: frame2['eastern']=frame2.state=='Ohio'
In [56]: frame2
Out[56]:
year state pop debt eastern
one 2000 Ohio 1.5 NaN True
two 2001 Ohio 1.7 -1.2 True
three 2002 Ohio 3.6 NaN True
four 2001 Nevada 2.4 -1.5 False
five 2002 Nevada 2.9 -1.7 False
In [57]: del frame2['eastern']
In [58]: frame2.columns
Out[58]: Index(['year', 'state', 'pop', 'debt'], dtype='object')
警告:通过索引方式返回的列只是相应数据的视图而已,并不是副本。因此,对返回的Series所做的任何就地修改全都会反映到源DataFrame上。通过Series的copy方法即可显示地赋值列。
10. 嵌套字典
嵌套字典(也就是字典的字典):
In [62]: pop={'Nevada':{2001:2.4,2002:2.9},'Ohio':{2000:1.5,2001:17,2002:3.6}}
#如果将它传给DataFrame,它就会被解释为:外层字典的键作为列,内层键则作为行索引:
In [63]: frame3=DataFrame(pop)
In [64]: frame3
Out[64]:
Nevada Ohio
2000 NaN 1.5
2001 2.4 17.0
2002 2.9 3.6
内层字典的键会被合并、排序以形成最终的索引。如果显式指定了索引,则不会这样:
In [66]: DataFrame(pop,index=[2001,2002,2003])
Out[66]:
Nevada Ohio
2001 2.4 17.0
2002 2.9 3.6
2003 NaN NaN
由Series组成的字典差不多也是一样的用法:
In [68]: pdata={'Ohio':frame3['Ohio'][:-1],'Nevada':frame3['Nevada'][:2]}
In [69]: DataFrame(pdata)
Out[69]:
Nevada Ohio
2000 NaN 1.5
2001 2.4 17.0
11. 转置
In [65]: frame3.T
Out[65]:
2000 2001 2002
Nevada NaN 2.4 2.9
Ohio 1.5 17.0 3.6
12.索引对象
Pandas的索引对象负责管理轴标签和其他元数据(比如轴名称等)。
Index对象是不可修改的(immutable),因此用户不能对其进行修改。
不可修改性非常重要,因为这样才能使Index对象在多个数据结构之间安全共享。
注意:虽然大部分用户都不需要知道太多关于Index对象的细节,但它们确实是pandas数据模型的重要组成部分。
「亲,如果笔记对您有帮助,收藏的同时,记得给点个赞、加个关注哦!感谢!」
「文中代码均亲测过,若有错误之处,欢迎批评指正,一起学习,一起成长!」