Python数据分析之pandas数据选取(下)

简介: Python数据分析之pandas数据选取(下)

3 区域选取


区域选取可以从多个维度(行和列)对数据进行筛选,可以通过df.loc[],df.iloc[],df.ix[]三种方法实现。采用df.loc[],df.iloc[],df.ix[]这三种方法进行数据选取时,方括号内必须有两个参数,第一个参数是对行的筛选条件,第二个参数是对列的筛选条件,两个参数用逗号隔开。df.loc[],df.iloc[],df.ix[]的区别如下:


df.loc[]只能使用标签索引,不能使用整数索引,通过便签索引切边进行筛选时,前闭后闭。


df.iloc[]只能使用整数索引,不能使用标签索引,通过整数索引切边进行筛选时,前闭后开。;


df.ix[]既可以使用标签索引,也可以使用整数索引。


下面分别通过实例演示这三种方法。


3.1 df.loc[]


1)对行进行选取


选取索引为‘a’的行:


>>> df.loc['a', :]
name         Joe
age           25
gender         1
isMarried    yes
Name: a, dtype: object


选取索引为‘a’或‘b’或‘c’的行


>>> df.loc[['a','b','c'], :]
   name   age  gender isMarried
a   Joe  25.0       1       yes
b  Mike  32.0       0       yes
c  Jack  18.0       1        no

选取从‘a’到‘d’的所有行(包括‘d’行)


>>> df.loc['a':'d', :]
   name   age  gender isMarried
a   Joe  25.0       1       yes
b  Mike  32.0       0       yes
c  Jack  18.0       1        no
d  Rose   NaN       1       yes


用布尔数组选取前3行


>>> df.loc[[True,True,True,False,False,False], :]
   name   age  gender isMarried
a   Joe  25.0       1       yes
b  Mike  32.0       0       yes
c  Jack  18.0       1        no


选取所有age大于30的行


>>> df.loc[df['age']>30,:]
    name   age  gender isMarried
b   Mike  32.0       0       yes
g  Wansi  41.0       0        no
i  Jason  37.0       1        no
j   Even  32.0       0        no


也可以使用下面两方法:


>>> df.loc[df.loc[:,'age']>30, :]
    name   age  gender isMarried
b   Mike  32.0       0       yes
g  Wansi  41.0       0        no
i  Jason  37.0       1        no
j   Even  32.0       0        no
>>> df.loc[df.iloc[:,1]>30, :]
    name   age  gender isMarried
b   Mike  32.0       0       yes
g  Wansi  41.0       0        no
i  Jason  37.0       1        no
j   Even  32.0       0        no


用callable对象选取age大于30的所有行


>>> df.loc[lambda df:df['age'] > 30, :]
    name   age  gender isMarried
b   Mike  32.0       0       yes
g  Wansi  41.0       0        no
i  Jason  37.0       1        no
j   Even  32.0       0        no


2)对列选取


输出所有人的姓名(选取name列)


>>> df.loc[:, 'name']
a      Joe
b     Mike
c     Jack
d     Rose
e    David
f    Marry
g    Wansi
h     Sidy
i    Jason
j     Even
Name: name, dtype: object


输出所有人的姓名和年龄(选取name和age列)


>>> df.loc[:, 'name':'age']
    name   age
a    Joe  25.0
b   Mike  32.0
c   Jack  18.0
d   Rose   NaN
e  David  15.0
f  Marry  20.0
g  Wansi  41.0
h   Sidy   NaN
i  Jason  37.0
j   Even  32.0


输出所有人的姓名、年龄、婚否(选取name、age、isMarried列)


>>> df.loc[:, ['name','age','isMarried']]
    name   age isMarried
a    Joe  25.0       yes
b   Mike  32.0       yes
c   Jack  18.0        no
d   Rose   NaN       yes
e  David  15.0        no
f  Marry  20.0        no
g  Wansi  41.0        no
h   Sidy   NaN       yes
i  Jason  37.0        no
j   Even  32.0        no


用布尔数组的方式选取前3列


>>> df.loc[:, [True,True,True,False]]
    name   age  gender
a    Joe  25.0       1
b   Mike  32.0       0
c   Jack  18.0       1
d   Rose   NaN       1
e  David  15.0       0
f  Marry  20.0       1
g  Wansi  41.0       0
h   Sidy   NaN       0
i  Jason  37.0       1
j   Even  32.0       0


3)同时对行和列进行筛选


输出年龄大于30的人的姓名和年龄


>>> df.loc[df['age']>30,['name','age']]
    name   age
b   Mike  32.0
g  Wansi  41.0
i  Jason  37.0
j   Even  32.0


输出行名为‘Mike’或‘Marry’的姓名和年龄


>>> df.loc[(df['name']=='Mike') |(df['name']=='Marry'),['name','age']]                                                    
    name   age
b   Mike  32.0
f  Marry  20.0


3.2 df.iloc[]


1)行选取


选取第2行


>>> df.iloc[1, :]
name         Mike
age            32
gender          0
isMarried     yes
Name: b, dtype: object


选取前3行


>>> df.iloc[:3, :]
   name   age  gender isMarried
a   Joe  25.0       1       yes
b  Mike  32.0       0       yes
c  Jack  18.0       1        no


选取第2行、第4行、第6行


>>> df.iloc[[1,3,5],:]
    name   age  gender isMarried
b   Mike  32.0       0       yes
d   Rose   NaN       1       yes
f  Marry  20.0       1        no


通过布尔数组选取前3行


>>> df.iloc[[True,True,True,False,False,False], :]
   name   age  gender isMarried
a   Joe  25.0       1       yes
b  Mike  32.0       0       yes
c  Jack  18.0       1        no


2)列选取


选取第2列


>>> df.iloc[:, 1]
a    25.0
b    32.0
c    18.0
d     NaN
e    15.0
f    20.0
g    41.0
h     NaN
i    37.0
j    32.0
Name: age, dtype: float64


选取前3列


>>> df.iloc[:, 0:3]
    name   age  gender
a    Joe  25.0       1
b   Mike  32.0       0
c   Jack  18.0       1
d   Rose   NaN       1
e  David  15.0       0
f  Marry  20.0       1
g  Wansi  41.0       0
h   Sidy   NaN       0
i  Jason  37.0       1
j   Even  32.0       0
l  选取第1列、第3列、第4列


选取第1列、第3列和第4列


>>> df.iloc[:, [0,2,3]]
    name  gender isMarried
a    Joe       1       yes
b   Mike       0       yes
c   Jack       1        no
d   Rose       1       yes
e  David       0        no
f  Marry       1        no
g  Wansi       0        no
h   Sidy       0       yes
i  Jason       1        no
j   Even       0        no


通过布尔数组选取前3列


>>> df.iloc[:,[True,True,True,False]]    name   age  gendera    Joe  25.0       1b   Mike  32.0       0c   Jack  18.0       1d   Rose   NaN       1e  David  15.0       0f  Marry  20.0       1g  Wansi  41.0       0h   Sidy   NaN       0i  Jason  37.0       1j   Even  32.0       0


3)同时选取行和列


选取第2行的第1列、第3列、第4列


>>> df.iloc[1, [0,2,3]]
name         Mike
gender          0
isMarried     yes
Name: b, dtype: object


选取前3行的前3列


>>> df.iloc[:3, :3]
   name   age  gender
a   Joe  25.0       1
b  Mike  32.0       0
c  Jack  18.0       1


3.3 df.ix[]


df.ix[]既可以通过整数索引进行数据选取,也可以通过标签索引进行数据选取,换句话说,df.ix[]是df.loc[]和df.iloc[]的功能集合,且在同义词选取中,可以同时使用整数索引和标签索引。


选取第3行的name数据


>>> df.ix[2,'name']
'Jack'


选取a行、c行的第1列,第2列和第4列数据


>>> df.ix[['a','c'], [0,1,3]]
   name   age isMarried
a   Joe  25.0       yes
c  Jack  18.0        no


选取所有未婚者的姓名和年龄


>>> df.ix[df['isMarried']=='no',['name','age']]
    name   age
c   Jack  18.0
e  David  15.0
f  Marry  20.0
g  Wansi  41.0
i  Jason  37.0
j   Even  32.0


4 单元格选取


单元格选取包括df.at[]和df.iat[]两种方法。df.at[]和df.iat[]使用时必须输入两个参数,即行索引和列索引,其中df.at[]只能使用标签索引,df.iat[]只能使用整数索引。df.at[]和df.iat[]选取的都是单个单元格(单行单列),所以返回值都为基本数据类型。


4.1 df.at[]


选取b行的name列


>>> df.at['b','name']
'Mike'


4.2 df.iat[]


选取第2行第1列


>>> df.iat[1,0]
'Mike'


5 拓展与总结


1)选取某一整行(多个整行)或某一整列(多个整列)数据时,可以用df[]、df.loc[]、df.iloc[],此时df[]的方法书写要简单一些。

2)进行区域选取时,如果只能用标签索引,则使用df.loc[]或df.ix[],如果只能用整数索引,则用df.iloc[]或df.ix[]。不过我看到有资料说,不建议使用df.ix[],因为df.loc[]和df.iloc[]更精确(有吗?我没理解精确在哪,望告知)。

3)如果选取单元格,则df.at[]、df.iat[]、df.loc[]、df.iloc[]都可以,不过要注意参数。

4)选取数据时,返回值存在以下情况:

如果返回值包括单行多列或多行单列时,返回值为Series对象;如果返回值包括多行多列时,返回值为DataFrame对象;如果返回值仅为一个单元格(单行单列)时,返回值为基本数据类型,例如str,int等。

5)df[]的方式只能选取行和列数据,不能精确到单元格,所以df[]的返回值一定DataFrame或Series对象。

6)当使用DataFrame的默认索引(整数索引)时,整数索引即为标签索引。例如,使用上面的data实例化一个DataFrame对象:


    >>> df2 = pd.DataFrame(data)
    >>> df2.loc[1,'name']
    'Mike'
    >>> df2.iloc[1,0]
    'Mike'
    相关文章
    |
    15天前
    |
    数据采集 数据可视化 数据挖掘
    利用Python自动化处理Excel数据:从基础到进阶####
    本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
    |
    20天前
    |
    机器学习/深度学习 算法 数据挖掘
    数据分析的 10 个最佳 Python 库
    数据分析的 10 个最佳 Python 库
    61 4
    数据分析的 10 个最佳 Python 库
    |
    1天前
    |
    数据采集 监控 数据挖掘
    常用电商商品数据API接口(item get)概述,数据分析以及上货
    电商商品数据API接口(item get)是电商平台上用于提供商品详细信息的接口。这些接口允许开发者或系统以编程方式获取商品的详细信息,包括但不限于商品的标题、价格、库存、图片、销量、规格参数、用户评价等。这些信息对于电商业务来说至关重要,是商品数据分析、价格监控、上货策略制定等工作的基础。
    |
    13天前
    |
    数据采集 分布式计算 大数据
    构建高效的数据管道:使用Python进行ETL任务
    在数据驱动的世界中,高效地处理和移动数据是至关重要的。本文将引导你通过一个实际的Python ETL(提取、转换、加载)项目,从概念到实现。我们将探索如何设计一个灵活且可扩展的数据管道,确保数据的准确性和完整性。无论你是数据工程师、分析师还是任何对数据处理感兴趣的人,这篇文章都将成为你工具箱中的宝贵资源。
    |
    27天前
    |
    存储 机器学习/深度学习 数据可视化
    数据集中存在大量的重复值,会对后续的数据分析和处理产生什么影响?
    数据集中存在大量重复值可能会对后续的数据分析和处理产生多方面的负面影响
    51 10
    |
    26天前
    |
    传感器 物联网 开发者
    使用Python读取串行设备的温度数据
    本文介绍了如何使用Python通过串行接口(如UART、RS-232或RS-485)读取温度传感器的数据。详细步骤包括硬件连接、安装`pyserial`库、配置串行端口、发送请求及解析响应等。适合嵌入式系统和物联网应用开发者参考。
    41 3
    |
    28天前
    |
    数据采集 数据可视化 数据处理
    Python数据科学:Pandas库入门与实践
    Python数据科学:Pandas库入门与实践
    |
    29天前
    |
    机器学习/深度学习 数据采集 数据可视化
    Python数据科学实战:从Pandas到机器学习
    Python数据科学实战:从Pandas到机器学习
    |
    26天前
    |
    数据采集 JavaScript 程序员
    探索CSDN博客数据:使用Python爬虫技术
    本文介绍了如何利用Python的requests和pyquery库爬取CSDN博客数据,包括环境准备、代码解析及注意事项,适合初学者学习。
    70 0
    |
    28天前
    |
    数据采集 存储 分布式计算
    超酷炫Python技术:交通数据的多维度分析
    超酷炫Python技术:交通数据的多维度分析