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'
    相关文章
    |
    1月前
    |
    数据采集 Web App开发 数据可视化
    Python零基础爬取东方财富网股票行情数据指南
    东方财富网数据稳定、反爬宽松,适合爬虫入门。本文详解使用Python抓取股票行情数据,涵盖请求发送、HTML解析、动态加载处理、代理IP切换及数据可视化,助你快速掌握金融数据爬取技能。
    1068 1
    |
    1月前
    |
    Java 数据处理 索引
    (Pandas)Python做数据处理必选框架之一!(二):附带案例分析;刨析DataFrame结构和其属性;学会访问具体元素;判断元素是否存在;元素求和、求标准值、方差、去重、删除、排序...
    DataFrame结构 每一列都属于Series类型,不同列之间数据类型可以不一样,但同一列的值类型必须一致。 DataFrame拥有一个总的 idx记录列,该列记录了每一行的索引 在DataFrame中,若列之间的元素个数不匹配,且使用Series填充时,在DataFrame里空值会显示为NaN;当列之间元素个数不匹配,并且不使用Series填充,会报错。在指定了index 属性显示情况下,会按照index的位置进行排序,默认是 [0,1,2,3,...] 从0索引开始正序排序行。
    220 0
    |
    1月前
    |
    Java 数据挖掘 数据处理
    (Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
    Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
    356 0
    |
    1月前
    |
    JSON 算法 API
    Python采集淘宝商品评论API接口及JSON数据返回全程指南
    Python采集淘宝商品评论API接口及JSON数据返回全程指南
    |
    1月前
    |
    JSON API 数据安全/隐私保护
    Python采集淘宝拍立淘按图搜索API接口及JSON数据返回全流程指南
    通过以上流程,可实现淘宝拍立淘按图搜索的完整调用链路,并获取结构化的JSON商品数据,支撑电商比价、智能推荐等业务场景。
    |
    1月前
    |
    数据可视化 大数据 关系型数据库
    基于python大数据技术的医疗数据分析与研究
    在数字化时代,医疗数据呈爆炸式增长,涵盖患者信息、检查指标、生活方式等。大数据技术助力疾病预测、资源优化与智慧医疗发展,结合Python、MySQL与B/S架构,推动医疗系统高效实现。
    |
    2月前
    |
    数据采集 关系型数据库 MySQL
    python爬取数据存入数据库
    Python爬虫结合Scrapy与SQLAlchemy,实现高效数据采集并存入MySQL/PostgreSQL/SQLite。通过ORM映射、连接池优化与批量提交,支持百万级数据高速写入,具备良好的可扩展性与稳定性。
    |
    2月前
    |
    JSON API 数据安全/隐私保护
    Python采集淘宝评论API接口及JSON数据返回全流程指南
    Python采集淘宝评论API接口及JSON数据返回全流程指南
    |
    机器学习/深度学习 数据采集 数据可视化
    基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
    本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
    824 4
    |
    数据采集 数据可视化 数据挖掘
    数据分析大神养成记:Python+Pandas+Matplotlib助你飞跃!
    在数字化时代,数据分析至关重要,而Python凭借其强大的数据处理能力和丰富的库支持,已成为该领域的首选工具。Python作为基石,提供简洁语法和全面功能,适用于从数据预处理到高级分析的各种任务。Pandas库则像是神兵利器,其DataFrame结构让表格型数据的处理变得简单高效,支持数据的增删改查及复杂变换。配合Matplotlib这一数据可视化的魔法棒,能以直观图表展现数据分析结果。掌握这三大神器,你也能成为数据分析领域的高手!
    249 2

    推荐镜像

    更多
    下一篇
    oss云网关配置