欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

pandas数据选择——基于iloc、loc等方法达到数据选择的多样性

程序员文章站 2022-03-15 15:01:26
基于pandas的数据索引,采用iloc、loc方法等进行数据的普通索引、布尔索引、切片索引的联用,进而得到对不同列、行、多列、多行、指定列与行数据的选取...

数据选择

1 列选择

1.1 选择某一列/某几列

在Python中我们要想获取某列只需要在表df后面的方括号中指明要选择的列名即可。如果是一列,则只需要传入一个列名;
如果是同时选择多列,则传入多个列名即可,多个列名用一个list存起来

import pandas as pd
df = pd.read_excel(r"D:\testdata\data.xlsx") 
print(df.head())
   实际价格(元)  运费(元)  数量  实际支付(元)      状态          商品SKU信息       省      市  \
0    218.9    0.0   1    218.9  已付款未发货       金色110cm 1个  内蒙古自治区  呼伦贝尔市   
1    218.9    0.0   1    218.9    交易关闭       金色120cm 1个  内蒙古自治区  呼伦贝尔市   
2    328.9    0.0   1    328.9    交易取消           米白S 1个     山东省    枣庄市   
3    218.9    0.0   1    218.9    交易关闭  黑色M 105-120斤 1个     浙江省    嘉兴市   
4    185.9    0.0   1    185.9  已付款未发货           黑色L 1个     陕西省    咸阳市   

        区       会员等级   优惠信息 是否白付美支付  货款退款金额  运费退款金额               退款完成时间  
0  新巴尔虎右旗  获取会员信息失败!  无优惠信息       否     0.0     0.0                  NaN  
1  新巴尔虎右旗  获取会员信息失败!  无优惠信息       否   218.9     0.0  2020-11-12 09:35:43  
2     薛城区  获取会员信息失败!  无优惠信息       否     0.0     0.0                  NaN  
3     桐乡市  获取会员信息失败!  无优惠信息       否   218.9     0.0  2020-11-12 06:37:25  
4     杨陵区  获取会员信息失败!  无优惠信息       是     0.0     0.0                  NaN  
print(df["省"].head())
0    内蒙古自治区
1    内蒙古自治区
2       山东省
3       浙江省
4       陕西省
Name: 省, dtype: object
print(df[["省","市"]].head())
        省      市
0  内蒙古自治区  呼伦贝尔市
1  内蒙古自治区  呼伦贝尔市
2     山东省    枣庄市
3     浙江省    嘉兴市
4     陕西省    咸阳市

除了传入具体的列名,我们还可以传入具体列的位置,即第几列,对数据进行选取,通过传入位置来获取数据时需要用到iloc方法

df.iloc[:,1:6].head() # 选取第1-5列的前五行数据
运费(元) 数量 实际支付(元) 状态 商品SKU信息
0 0.0 1 218.9 已付款未发货 金色110cm 1个
1 0.0 1 218.9 交易关闭 金色120cm 1个
2 0.0 1 328.9 交易取消 米白S 1个
3 0.0 1 218.9 交易关闭 黑色M 105-120斤 1个
4 0.0 1 185.9 已付款未发货 黑色L 1个
df.iloc[:,[1,5]].head() # 选取第一列、第五列的前五行数据
运费(元) 商品SKU信息
0 0.0 金色110cm 1个
1 0.0 金色120cm 1个
2 0.0 米白S 1个
3 0.0 黑色M 105-120斤 1个
4 0.0 黑色L 1个

iloc 后的方括号中逗号之前的部分表示要获取的行的位置,只输入一个冒号,不输入任何数值表示获取所有的行;逗号之后的方括号表示要获取的列的位置,列的位置同样是也是从0开始计数。

loc、iloc、ix方法的使用:

loc:值索引通过选取行(列)标签索引数据,通过行索引 “Index” 中的具体值来取行数据
iloc:位置索引,通过选取行(列)位置编号索引数据,列表形式
ix:既可以通过行(列)标签索引数据,也可以通过行(列)位置编号索引数据

df.loc[:,"省":"区"].head() # 选取省,市,区的前五行数据
0 内蒙古自治区 呼伦贝尔市 新巴尔虎右旗
1 内蒙古自治区 呼伦贝尔市 新巴尔虎右旗
2 山东省 枣庄市 薛城区
3 浙江省 嘉兴市 桐乡市
4 陕西省 咸阳市 杨陵区
df.loc[:,["省","市","区"]].head() # 选取省,市,区的前五行数据
0 内蒙古自治区 呼伦贝尔市 新巴尔虎右旗
1 内蒙古自治区 呼伦贝尔市 新巴尔虎右旗
2 山东省 枣庄市 薛城区
3 浙江省 嘉兴市 桐乡市
4 陕西省 咸阳市 杨陵区

1.2 选择连续的某几列

df.iloc[:,1:5].head()  # 选取连续的第1到4列
运费(元) 数量 实际支付(元) 状态
0 0.0 1 218.9 已付款未发货
1 0.0 1 218.9 交易关闭
2 0.0 1 328.9 交易取消
3 0.0 1 218.9 交易关闭
4 0.0 1 185.9 已付款未发货

iloc后的方括号中逗号之前的表示选择的行,当只传入一个冒号时,表示选择所有行;
逗号后面表示要选择列的位置区间,1:5表示选择第2列到第5列之间的值(包含第2列但不包含第5列),我们把这种通过传入一个位置区间来获取数据的方式称为切片索引。

1.3 利用loc、iloc提取指定行、列数据

df.loc[[0,3],["省","市"]] # 选取第0行与第3行的省与市的数据
0 内蒙古自治区 呼伦贝尔市
3 浙江省 嘉兴市
df.iloc[[0,3],[6,7]]  # 选取第0行与第3行的省与市的数据
0 内蒙古自治区 呼伦贝尔市
3 浙江省 嘉兴市

1.4 利用loc函数,根据某个数据来提取数据所在的行

df.loc[df["省"]=="内蒙古自治区"]
实际价格(元) 运费(元) 数量 实际支付(元) 状态 商品SKU信息 会员等级 优惠信息 是否白付美支付 货款退款金额 运费退款金额 退款完成时间
0 218.9 0.0 1 218.9 已付款未发货 金色110cm 1个 内蒙古自治区 呼伦贝尔市 新巴尔虎右旗 获取会员信息失败! 无优惠信息 0.0 0.0 NaN
1 218.9 0.0 1 218.9 交易关闭 金色120cm 1个 内蒙古自治区 呼伦贝尔市 新巴尔虎右旗 获取会员信息失败! 无优惠信息 218.9 0.0 2020-11-12 09:35:43
52 199.0 0.0 1 199.0 交易取消 黑色M 105-120斤 1个 内蒙古自治区 呼和浩特市 清水河县 获取会员信息失败! 无优惠信息 0.0 0.0 NaN

传入多个条件, 连接符号 &

df.loc[(df["省"]=="内蒙古自治区")&(df["商品SKU信息"]=="黑色M 105-120斤 1个")]
实际价格(元) 运费(元) 数量 实际支付(元) 状态 商品SKU信息 会员等级 优惠信息 是否白付美支付 货款退款金额 运费退款金额 退款完成时间
52 199.0 0.0 1 199.0 交易取消 黑色M 105-120斤 1个 内蒙古自治区 呼和浩特市 清水河县 获取会员信息失败! 无优惠信息 0.0 0.0 NaN

1.5 选择单列多行、多列多行

df["状态"][0:3]  # 选择状态列第0到2行
0    已付款未发货
1      交易关闭
2      交易取消
Name: 状态, dtype: object
df[["状态","商品SKU信息"]][0:3] # 选择状态列、商品SKU信息列的第0到2行
状态 商品SKU信息
0 已付款未发货 金色110cm 1个
1 交易关闭 金色120cm 1个
2 交易取消 米白S 1个

2 行选择

2.1 选择某一行/某几行

在Python中,获取行的方式主要有两种,一种是普通索引,即传入具体行索引的名称,需要用到loc方法;另一种是位置索引,即传入具体的行数,需要用到iloc方法。

df.loc[1]    #  选取索引值为1的行(第2行)
实际价格(元)                  218.9
运费(元)                        0
数量                           1
实际支付(元)                  218.9
状态                        交易关闭
商品SKU信息             金色120cm 1个
省                       内蒙古自治区
市                        呼伦贝尔市
区                       新巴尔虎右旗
会员等级                 获取会员信息失败!
优惠信息                     无优惠信息
是否白付美支付                      否
货款退款金额                   218.9
运费退款金额                       0
退款完成时间     2020-11-12 09:35:43
Name: 1, dtype: object
df.loc[[1,3],["订单编号","物品名称"]]  # 提取index为'1','3',列名为'订单编号','物品名称'中的数据
订单编号 物品名称
1 96941475341528 【叶子yzzz】叶子专享】DSR08B0660鸭鸭男童羽绒服
3 96940910667716 【叶子yzzz】鸭鸭新款女装羽绒服DRH06B0050
df.iloc[[1,3]]  # 选取行索引为1 与 3 的行数据
实际价格(元) 运费(元) 数量 实际支付(元) 状态 商品SKU信息 会员等级 优惠信息 是否白付美支付 货款退款金额 运费退款金额 退款完成时间
1 218.9 0.0 1 218.9 交易关闭 金色120cm 1个 内蒙古自治区 呼伦贝尔市 新巴尔虎右旗 获取会员信息失败! 无优惠信息 218.9 0.0 2020-11-12 09:35:43
3 218.9 0.0 1 218.9 交易关闭 黑色M 105-120斤 1个 浙江省 嘉兴市 桐乡市 获取会员信息失败! 无优惠信息 218.9 0.0 2020-11-12 06:37:25

2.2 选择满足条件的行

在Python中,我们直接在表名后面指明哪列要满足什么条件,就可以把满足条件的数据筛选出来。

df["实际价格(元)"]>200 # 判断实际价格是否大于200,返回True,False
0      True
1      True
2      True
3      True
4     False
      ...  
83     True
84     True
85     True
86     True
87     True
Name: 实际价格(元), Length: 88, dtype: bool
df[df["实际价格(元)"]>200].head()  # 选择实际价格大于200的前5行数据
实际价格(元) 运费(元) 数量 实际支付(元) 状态 商品SKU信息 会员等级 优惠信息 是否白付美支付 货款退款金额 运费退款金额 退款完成时间
0 218.9 0.0 1 218.9 已付款未发货 金色110cm 1个 内蒙古自治区 呼伦贝尔市 新巴尔虎右旗 获取会员信息失败! 无优惠信息 0.0 0.0 NaN
1 218.9 0.0 1 218.9 交易关闭 金色120cm 1个 内蒙古自治区 呼伦贝尔市 新巴尔虎右旗 获取会员信息失败! 无优惠信息 218.9 0.0 2020-11-12 09:35:43
2 328.9 0.0 1 328.9 交易取消 米白S 1个 山东省 枣庄市 薛城区 获取会员信息失败! 无优惠信息 0.0 0.0 NaN
3 218.9 0.0 1 218.9 交易关闭 黑色M 105-120斤 1个 浙江省 嘉兴市 桐乡市 获取会员信息失败! 无优惠信息 218.9 0.0 2020-11-12 06:37:25
7 416.9 0.0 1 416.9 交易关闭 豆绿色S(90-105斤) 1个 湖南省 衡阳市 耒阳市 获取会员信息失败! 无优惠信息 416.9 0.0 2020-11-12 08:47:19

传入多个条件, 连接符号 &

df[(df["实际价格(元)"]>200) & (df["实际支付(元)"]<300)]   #  选择实际价格大于200和实际支付小于300的行
实际价格(元) 运费(元) 数量 实际支付(元) 状态 商品SKU信息 会员等级 优惠信息 是否白付美支付 货款退款金额 运费退款金额 退款完成时间
0 218.9 0.0 1 218.9 已付款未发货 金色110cm 1个 内蒙古自治区 呼伦贝尔市 新巴尔虎右旗 获取会员信息失败! 无优惠信息 0.0 0.0 NaN
1 218.9 0.0 1 218.9 交易关闭 金色120cm 1个 内蒙古自治区 呼伦贝尔市 新巴尔虎右旗 获取会员信息失败! 无优惠信息 218.9 0.0 2020-11-12 09:35:43
3 218.9 0.0 1 218.9 交易关闭 黑色M 105-120斤 1个 浙江省 嘉兴市 桐乡市 获取会员信息失败! 无优惠信息 218.9 0.0 2020-11-12 06:37:25

2.2 普通索引+普通索引选择指定的行和列

普通索引+普通索引就是通过同时传入行和列的索引名称进行数据选择,需要用到loc方法

loc方法中的第一对方括号表示行索引的选择,传入行索引名称;loc方法中的第二对方括号表示列索引的选择,传入列索引名称

df.loc[[1,3,5],["实际价格(元)","实际支付(元)"]]   #  选择索引值为1,3,5的实际价格和实际支付的行数据
实际价格(元) 实际支付(元)
1 218.9 218.9
3 218.9 218.9
5 196.9 196.9

2.3 位置索引+位置索引选择指定的行和列

位置索引+位置索引是通过同时传入行、列索引的位置来获取数据,需要用到iloc方法

在iloc方法中的第一对方括号表示行索引的选择,传入要选择行索引的位置;第二对方括号表示列索引的选择,传入要选择列索引的位置。行和列索引的位置都是从0开始计数

df.iloc[[1,3,5],[3,4,5]]   # 选择行索引位置为1,3,5的列索引位置为3,4,5的行数据
实际支付(元) 状态 商品SKU信息
1 218.9 交易关闭 金色120cm 1个
3 218.9 交易关闭 黑色M 105-120斤 1个
5 196.9 交易关闭 黑色M 1个

2.4 布尔索引+普通索引选择指定的行和列

布尔索引+普通索引是先对表进行布尔索引选择行,然后通过普通索引选择列

df[df["实际价格(元)"]>200][["运费(元)","数量","实际价格(元)"]]
运费(元) 数量 实际价格(元)
0 0.0 1 218.9
1 0.0 1 218.9
2 0.0 1 328.9
3 0.0 1 218.9
7 0.0 1 416.9
9 0.0 1 328.9
11 0.0 1 2199.0
41 0.0 1 2199.0
44 0.0 1 2199.0
69 0.0 1 2199.0
83 0.0 1 2199.0
84 0.0 1 658.9
85 0.0 1 328.9
86 0.0 1 328.9
87 0.0 1 328.9

2.5 切片索引+切片索引选择指定的行和列

切片索引+切片索引是通过同时传入行、列索引的位置区间进行数据选择

df.iloc[0:3,1:3]
运费(元) 数量
0 0.0 1
1 0.0 1
2 0.0 1

2.6 切片索引+普通索引选择指定的行和列

df[["实际价格(元)","实际支付(元)"]].iloc[0:2]
实际价格(元) 实际支付(元)
0 218.9 218.9
1 218.9 218.9

本文地址:https://blog.csdn.net/FGH333xwy/article/details/110431919