数据选择
之前是把所有的菜品都洗好并放在不同的容器里,现在要进行切配了。需要吧这些菜品挑选出来,比如做一盘凉拌黄瓜,需要先把黄瓜找出来;数据分析就是你要分析什么,就把对应的数据筛选出来
常规的数据选择主要有:列选择,行选择,行列同时选择三种
列选择
选择某一列/某几列
Excel
在Excel中选择某一列直接用鼠标选中这一列即可;如果要同时选择多列,且待选择的列不是相邻的,这个时候可以先选中其中一列,然后再按住Ctrl键不放,再选择其他列。
Python
import pandas as pd
df = pd.read_excel('04-数据选择列选择.xlsx')
在python中我们想要获取某列只需要在df后边的方括号中指明要选择的列明即可,如果是一列,则只需要传入一个列名,如果是多列,则传入多个列名,多个列名用list保存起来
df
订单编号 | 客户姓名 | SN码 | 成交时间 | |
0 | A1 | 周一 | 101 | 2018-08-08 |
1 | A2 | 吴二 | 102 | 2018-08-09 |
2 | A3 | 郑三 | 103 | 2018-08-10 |
3 | A3 | 郑三 | 103 | 2018-08-10 |
4 | A4 | 赵四 | 104 | 2018-08-11 |
5 | A5 | 赵四 | 104 | 2018-08-12 |
df['订单编号']
0 A1
1 A2
2 A3
3 A3
4 A4
5 A5
Name: 订单编号, dtype: object
df[['订单编号','客户姓名']] # 这里注意,将多个参数写成一个列表,相当于只传入了一个参数
订单编号 | 客户姓名 | |
0 | A1 | 周一 |
1 | A2 | 吴二 |
2 | A3 | 郑三 |
3 | A3 | 郑三 |
4 | A4 | 赵四 |
5 | A5 | 赵四 |
在Python中我们把通过传入列名选择数据的方式称之为普通索引。
除了传入具体的列名,我们还可以传入具体列的位置,即第几列,对数据进行选取,通过传入位置来获取数据时需要用iloc方法。
# 获取第一列和第三列的数值
df
订单编号 | 客户姓名 | SN码 | 成交时间 | |
0 | A1 | 周一 | 101 | 2018-08-08 |
1 | A2 | 吴二 | 102 | 2018-08-09 |
2 | A3 | 郑三 | 103 | 2018-08-10 |
3 | A3 | 郑三 | 103 | 2018-08-10 |
4 | A4 | 赵四 | 104 | 2018-08-11 |
5 | A5 | 赵四 | 104 | 2018-08-12 |
df.iloc[:, [0, 2]] # 获取第一列和第三列的数值
订单编号 | SN码 | |
0 | A1 | 101 |
1 | A2 | 102 |
2 | A3 | 103 |
3 | A3 | 103 |
4 | A4 | 104 |
5 | A5 | 104 |
在上边的代码中,iloc后边的方括号中逗号之前的部分表示要获取的行的位置,只输入一个冒号,不输入任何数值表示获取所有行。逗号之后的方括号表示要获取的列的位置,列的位置同样是从0开始计数。
以上通过传入具体的位置来选择数据的方式称为位置索引
选择连续某几列
Excel
在Excel中,要选择连续几列时,直接用鼠标选中这几列即可操作。当然了,你也可以先选择一列,然后按住Ctrl键再去选择其他列,由于要选择的列是连续的,因此无需那么麻烦
Python
在python中可以通过前面介绍的普通索引和位置索引获取某一列或多列数据。当你要获取的是连续某几列,用普通索引和位置索引也是可以做到的,但是因为你要获取的列是连续的,所以只要传入这些连续列的位置区间即可,同样需要用到iloc方法
# 获取第 1 列到第 4 列的数据
df
df.iloc[:, 0:3]
订单编号 | 客户姓名 | SN码 | |
0 | A1 | 周一 | 101 |
1 | A2 | 吴二 | 102 |
2 | A3 | 郑三 | 103 |
3 | A3 | 郑三 | 103 |
4 | A4 | 赵四 | 104 |
5 | A5 | 赵四 | 104 |
在上面的代码中,iloc后的方括号之前的代表选择的行,当只传入一个冒号时,表示选择所有行;逗号后面表示要选择的列的位置区间,0:3表示选择第一列到第四列之间的值(包含第 1 列但是不包含第 4 列), 我们把这种通过传入一个位置区间来获取数据的方式称为切片索引
行选择
选择某一行/某几行
Excel
在Excel中选择行与选择列的方式是一样的,先选择一行,然后按住Ctrl键再选择其他行
Python
df = pd.read_excel('05-数据选择行选择 .xlsx')
在python中,获取行的主要方式有两种:
- 普通索引:即传入具体行索引的名称,需要用到 loc 方法
- 位置索引:即传入具体的行数,需要用到 iloc 方法
# 利用 loc 方法
df
订单编号 | 客户姓名 | SN码 | 成交时间 | |
0 | A1 | 周一 | 101 | 2018-08-08 |
1 | A2 | 吴二 | 102 | 2018-08-09 |
2 | A3 | 郑三 | 103 | 2018-08-10 |
3 | A3 | 郑三 | 103 | 2018-08-10 |
4 | A4 | 赵四 | 104 | 2018-08-11 |
5 | A5 | 赵四 | 104 | 2018-08-12 |
df.loc[0] # 注意这里使用的是方括号
订单编号 A1
客户姓名 周一
SN码 101
成交时间 2018-08-08 00:00:00
Name: 0, dtype: object
# 利用iloc方法
df
订单编号 | 客户姓名 | SN码 | 成交时间 | |
0 | A1 | 周一 | 101 | 2018-08-08 |
1 | A2 | 吴二 | 102 | 2018-08-09 |
2 | A3 | 郑三 | 103 | 2018-08-10 |
3 | A3 | 郑三 | 103 | 2018-08-10 |
4 | A4 | 赵四 | 104 | 2018-08-11 |
5 | A5 | 赵四 | 104 | 2018-08-12 |
df.iloc[0]
订单编号 A1
客户姓名 周一
SN码 101
成交时间 2018-08-08 00:00:00
Name: 0, dtype: object
df.iloc[[0, 1]]
订单编号 | 客户姓名 | SN码 | 成交时间 | |
0 | A1 | 周一 | 101 | 2018-08-08 |
1 | A2 | 吴二 | 102 | 2018-08-09 |
选择连续的某几行
Excel
在Excel中选择连续的某几行与选择连续的某几行方法一致
Python
在Python中,选择连续某几行时,你同样可以把要选择的每一个行索引名字或者行索引的位置输进去。很显然这样是没有必要的,只要把连续行的位置用一个区间表示,然后传给iloc即可
df
订单编号 | 客户姓名 | SN码 | 成交时间 | |
0 | A1 | 周一 | 101 | 2018-08-08 |
1 | A2 | 吴二 | 102 | 2018-08-09 |
2 | A3 | 郑三 | 103 | 2018-08-10 |
3 | A3 | 郑三 | 103 | 2018-08-10 |
4 | A4 | 赵四 | 104 | 2018-08-11 |
5 | A5 | 赵四 | 104 | 2018-08-12 |
df.iloc[0:3]
订单编号 | 客户姓名 | SN码 | 成交时间 | |
0 | A1 | 周一 | 101 | 2018-08-08 |
1 | A2 | 吴二 | 102 | 2018-08-09 |
2 | A3 | 郑三 | 103 | 2018-08-10 |
选择满足条件的行
前两节获取某一列时,获取的是这一列的所有行,我们还可以只筛选出这一列满足条件的值。
比如年龄这一列,需要吧非异常值(大于200的属于异常值),即小于200岁的年龄筛选出来,如何实现呢
Excel
在Excel中我们直接使用筛选功能,将满足条件的值筛选出来
Python
import pandas as pd
df = pd.read_excel('06-筛选满足条件的行.xlsx')
在python中,我们直接在表名后面指明哪列要满足什么条件,就可以把满足条件的数据筛选出来
df[df['年龄']<200]
订单编号 | 客户姓名 | SN码 | 年龄 | 成交时间 | |
0 | A1 | 周一 | 101 | 31 | 2018-08-08 |
1 | A2 | 吴二 | 102 | 45 | 2018-08-09 |
2 | A3 | 郑三 | 103 | 23 | 2018-08-10 |
我们把上面这种通过传入一个判断条件来选择数据的方式称为布尔索引。
传入的条件还可以是多个,如下为选择的年龄小于200且SN码小于102的数据
df[(df['年龄']<200) & (df['SN码']<102)] # 这里注意,每一个单独的条件需要用小括号分开
订单编号 | 客户姓名 | SN码 | 年龄 | 成交时间 | |
0 | A1 | 周一 | 101 | 31 | 2018-08-08 |
行列同时选择
上面的数据选择都是针对单一的行或者列进行选择,实际业务中我们也会用到行,列同时选择,所谓的行,列同时选择就是选择出行和列相交的部分,而在Excel中,是直接通过鼠标拖拽实现的,不再赘述
普通索引 + 普通索引选择指定的行和列
普通索引 + 普通索引就是通过同时传入行和列的索引名称进行数据选择,需要用loc方法
df # 获取第一行,第三行和第一列,第三列的数据
订单编号 | 客户姓名 | SN码 | 年龄 | 成交时间 | |
0 | A1 | 周一 | 101 | 31 | 2018-08-08 |
1 | A2 | 吴二 | 102 | 45 | 2018-08-09 |
2 | A3 | 郑三 | 103 | 23 | 2018-08-10 |
3 | A3 | 郑三 | 103 | 230 | 2018-08-10 |
4 | A4 | 赵四 | 104 | 240 | 2018-08-11 |
5 | A5 | 赵四 | 104 | 250 | 2018-08-12 |
df.loc[[0, 2], ['订单编号', 'SN码']]
订单编号 | SN码 | |
0 | A1 | 101 |
2 | A3 | 103 |
loc方法中的第一对方括号表示行索引的选择,传入行索引名称;
loc方法中的第二对方括号表示列索引的选择,传入列索引名称。
位置索引 + 位置索引选择指定的行和列
位置索引 + 位置索引是通过同时传入行,列索引的位置来获取数据,需要用到iloc方法
# 获取第一行,第二行和第一列,第三列数据
df
订单编号 | 客户姓名 | SN码 | 年龄 | 成交时间 | |
0 | A1 | 周一 | 101 | 31 | 2018-08-08 |
1 | A2 | 吴二 | 102 | 45 | 2018-08-09 |
2 | A3 | 郑三 | 103 | 23 | 2018-08-10 |
3 | A3 | 郑三 | 103 | 230 | 2018-08-10 |
4 | A4 | 赵四 | 104 | 240 | 2018-08-11 |
5 | A5 | 赵四 | 104 | 250 | 2018-08-12 |
# 利用iloc方法传入行列位置
df.iloc[[0, 1], [0, 2]]
订单编号 | SN码 | |
0 | A1 | 101 |
1 | A2 | 102 |
在iloc方法中的第一对方括号表示行索引的选择, 传入要选择行索引的位置;第二对方括号表示列索引的选择,传入要选择的位置索引。
行和列索引的位置都是从0开始计数。
布尔索引 + 普通索引选择指定的行和列
布尔索引 + 普通索引是先对表进行布尔索引选择行,然后通过普通索引选择列
df
订单编号 | 客户姓名 | SN码 | 年龄 | 成交时间 | |
0 | A1 | 周一 | 101 | 31 | 2018-08-08 |
1 | A2 | 吴二 | 102 | 45 | 2018-08-09 |
2 | A3 | 郑三 | 103 | 23 | 2018-08-10 |
3 | A3 | 郑三 | 103 | 230 | 2018-08-10 |
4 | A4 | 赵四 | 104 | 240 | 2018-08-11 |
5 | A5 | 赵四 | 104 | 250 | 2018-08-12 |
df[df['年龄']<200][['订单编号', '年龄']]
订单编号 | 年龄 | |
0 | A1 | 31 |
1 | A2 | 45 |
2 | A3 | 23 |
上面代码表示选择年龄小于200的订单编号和年龄,先通过布尔索引选择出年龄小于200的所有行,然后通过普通索引选择订单编号和年龄这两列。
切片索引 + 切片索引选择指定的行和列
切片索引 + 切片索引是通过同时传入行,列索引的位置区间进行数据选择。
# 选择第一到第三行,第二列到第三列
df
订单编号 | 客户姓名 | SN码 | 年龄 | 成交时间 | |
0 | A1 | 周一 | 101 | 31 | 2018-08-08 |
1 | A2 | 吴二 | 102 | 45 | 2018-08-09 |
2 | A3 | 郑三 | 103 | 23 | 2018-08-10 |
3 | A3 | 郑三 | 103 | 230 | 2018-08-10 |
4 | A4 | 赵四 | 104 | 240 | 2018-08-11 |
5 | A5 | 赵四 | 104 | 250 | 2018-08-12 |
df.iloc[0:3, 1:3]
客户姓名 | SN码 | |
0 | 周一 | 101 |
1 | 吴二 | 102 |
2 | 郑三 | 103 |
切片索引 + 普通索引选择指定的行和列
前边我们说过,如果是普通索引,就直接传入行或列名,用loc方法即可;如果是切片索引,也就是传入行或列的位置区间,要用iloc方法。如果是切片索引 + 普通索引,也就是行(列)用切片索引,列(行)用普通索引,这种交叉索引要用ix方法
# 选择第一到第三行,客户姓名和SN码这两列
df
订单编号 | 客户姓名 | SN码 | 年龄 | 成交时间 | |
0 | A1 | 周一 | 101 | 31 | 2018-08-08 |
1 | A2 | 吴二 | 102 | 45 | 2018-08-09 |
2 | A3 | 郑三 | 103 | 23 | 2018-08-10 |
3 | A3 | 郑三 | 103 | 230 | 2018-08-10 |
4 | A4 | 赵四 | 104 | 240 | 2018-08-11 |
5 | A5 | 赵四 | 104 | 250 | 2018-08-12 |
df.ix[0:3, ['客户姓名', 'SN码']]
客户姓名 | SN码 | |
0 | 周一 | 101 |
1 | 吴二 | 102 |
2 | 郑三 | 103 |
3 | 郑三 | 103 |