1、以类似dict
的方式访问
上一篇教程开头以dict
的形式实例化了第一个DataFrame
,也证实了它的确可以用类似dict
的方式来获取数据:
import pandas as pd
df = pd.DataFrame({
'月份': [1,2,3,4,5,2,3,4,5,1,2,3,4],
'姓名':['张三','张三','张三','张三','张三','李四','李四','李四','李四','王五','王五','王五','王五'],
'性别':['男','男','女','女','女','男','男','男','男','女','女','女','女'],
'应发工资':[2000,2000,2000,2000,2000,1800,1800,1800,1800,1800,1800,1800,1800],
'实发工资':[1500,1000,15000,1500,1500,1300,1300,1300,1300,1300,1300,1300,1300],
'职位':['主犯','主犯','主犯','主犯','主犯','从犯','从犯','从犯','从犯','龙套','龙套','龙套','龙套']
})
df['姓名']
0 张三
1 张三
2 张三
3 张三
4 张三
5 李四
6 李四
7 李四
8 李四
9 王五
10 王五
11 王五
12 王五
Name: 姓名, dtype: object
在此基础上,还可以进一步进行复杂的操作,例如
- 访问多列:
df[['姓名','职位']]
姓名 职位
0 张三 主犯
1 张三 主犯
2 张三 主犯
3 张三 主犯
4 张三 主犯
5 李四 从犯
6 李四 从犯
7 李四 从犯
8 李四 从犯
9 王五 龙套
10 王五 龙套
11 王五 龙套
12 王五 龙套
- 当访问时列的顺序不同时:
df[['职位','姓名']]
职位 姓名
0 主犯 张三
1 主犯 张三
2 主犯 张三
3 主犯 张三
4 主犯 张三
5 从犯 李四
6 从犯 李四
7 从犯 李四
8 从犯 李四
9 龙套 王五
10 龙套 王五
11 龙套 王五
12 龙套 王五
另外,这种方式不权可以访问数据,还可以作为索引对数据进行修改,比如交换两个列:
df[['职位','姓名']] = df[['姓名','职位']]
# 姓名和职位的对应数据发生了改变
df
月份 姓名 性别 应发工资 实发工资 职位
0 1 主犯 男 2000 1500 张三
1 2 主犯 男 2000 1000 张三
2 3 主犯 女 2000 15000 张三
3 4 主犯 女 2000 1500 张三
4 5 主犯 女 2000 1500 张三
5 2 从犯 男 1800 1300 李四
6 3 从犯 男 1800 1300 李四
7 4 从犯 男 1800 1300 李四
8 5 从犯 男 1800 1300 李四
9 1 龙套 女 1800 1300 王五
10 2 龙套 女 1800 1300 王五
11 3 龙套 女 1800 1300 王五
12 4 龙套 女 1800 1300 王五
2、以属性方式访问数据
以下代码可能引起不适!!!!
df.职位
0 张三
1 张三
2 张三
3 张三
4 张三
5 李四
6 李四
7 李四
8 李四
9 王五
10 王五
11 王五
12 王五
Name: 职位, dtype: object
它居然支持中文变量名!!!!
注意:这里和dict
类型的操作方式就有所不同了,如果是一个单纯的dict
我们来看:
mydict = {'a':1,'b':2}
mydict.a
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-9-20721cfb64a6> in <module>
----> 1 mydict.a
AttributeError: 'dict' object has no attribute 'a'
此时报错:dict
并没有名称为a
这个属性。而DataFrame
则提供了这样一种索引方式。
接上一篇教程,我们知道当访问的结果是一列时,返回的结果就变成了Series
类。
3、访问行(slicing)
df[:2]
月份 姓名 性别 应发工资 实发工资 职位
0 1 主犯 男 2000 1500 张三
1 2 主犯 男 2000 1000 张三
df[1:5]
月份 姓名 性别 应发工资 实发工资 职位
1 2 主犯 男 2000 1000 张三
2 3 主犯 女 2000 15000 张三
3 4 主犯 女 2000 1500 张三
4 5 主犯 女 2000 1500 张三
注意: 这种方式不能以单个下标进行访问
df[2]
D:\ProgramData\Anaconda3\envs\pytorch\lib\site-packages\pandas\core\frame.py in __getitem__(self, key)
...## 此处省略约10余行报错信息
KeyError: 2
注意: 不能直接像访问数组一样访问单个单元信息:
df[1,2]
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
# 省略约20余行报错信息
4、用loc
方法访问不同行列
df.loc[:2,['职位']]
职位
0 张三
1 张三
2 张三
而此时可以访问单独的一行:
df.loc[2,['职位']]
职位 张三
Name: 2, dtype: object
注意:
loc
方法第二个位置的索引必须是表头的列表或字符串,不能是数字!
5、用iloc
方法直接访问行列
df.iloc[1,2]
'男'
df.iloc[1,:2]
月份 2
姓名 主犯
Name: 1, dtype: object
df.iloc[:2,1]
0 主犯
1 主犯
Name: 姓名, dtype: object
不难看到这时数据的访问方式和数组等类型的访问方式就基本一致了。
6、其它方式
旧的版本里面还有ix
方法,不过新版已经没有这项功能了,它的用法兼顾了loc
和iloc
方法。另外还有快速定位的方法at,iat
,但这两种方法除了速度较快以外也并没有特别之处,因此不多叙述,有兴趣的同学可以自行查询官方文档。