使用 iloc 从DataFrame中筛选数据
iloc 是基于“位置”的Dataframe的操作,即主要基于下标的操作
简单使用
Pandas中的 iloc 是用基于整数的下标来进行数据定位/选择
iloc 的语法是 data.iloc[<row selection>, <column selection>]
, iloc 在Pandas中是用来通过数字来选择数据中具体的某些行和列。你可以设想每一行都有一个对应的下标(0,1,2,...),通过 iloc 我们可以利用这些下标去选择相应的行数据。同理,对于行也一样,想象每一列也有对应的下标(0,1,2,...),通过这些下标也可以选择相应的列数据。
在iloc中一共有 2 个 “参数” -行选择器 和 -列选择器,例如:
# 使用DataFrame 和 iloc 进行单行/列的选择
# 行选择:
data.iloc[0] # 数据中的第一行
data.iloc[1] # 数据中的第二行
data.iloc[-1] # 数据中的最后一行
# 列选择:
data.iloc[:, 0] # 数据中的第一列
data.iloc[:, 1] # 数据中的第二列
data.iloc[:, -1] # 数据中的最后一列
行列混合选择
iloc 同样可以进行和列的混合选择,例如:
# 使用 iloc 进行行列混合选择
data.iloc[0:5] # 数据中的第 1-5 行
data.iloc[:, 0:2] # 选择数据中的前2列和所有行
data.iloc[[0, 3, 6, 24], [0, 5, 6]] # 选择第 1,4,7,25行 和 第 1,6,7 列
data.iloc[0:5, 5:8] # 选择第1-6行 和 6-9列
使用 iloc 注意以下两点:
-
如果使用iloc只选择了单独的一行会返回 Series 类型,而如果选择了多行数据则会返回 DataFrame 类型,如果你只选择了一行,但如果想要返回 DataFrame 类型可以传入一个单值list,具体例子看图:
-
当你使用 [1:5] 这种语法对数据进行切片的时候,要注意只选择了 1,2,3,4 这 4 个下标,而 5 并没有被包括进去,即使用[x:y]选择了下标从 x 到 y-1 的数据
实际工作中,其实很少用到 iloc ,除非你想选择第一行( data.iloc[0] ) 或者 最后一行( data.iloc[-1] )
使用 loc 从DataFrame中筛选数据
可以在以下2中情况下使用 ioc:
- 使用 基于标签(列头)的下标的 查找
- 使用 boolean / 有条件的 查找
使用 loc 的语法和 iloc 一样:data.loc[<row selection>, <column selection>]
使用基于标签(列头)的下标数据选择
使用 loc 进行数据选择是基于下标的(如果有的话),可以使用 df.set_index()
来设置下标, loc 方法直接通过下标来选择行。
例如将"last_name"这一列设置为下标:
data.set_index("last_name", inplace=True)
效果如图:
现在我们已经将下标设置为"last_name",这样我们就可以根据"last_name"选择不同的数据了,使用 data.loc[<label>]
同样的可以查找单个值或者多个值,例子如图:
注意,第一个样例代码返回的是 Series 类型,而第二个样例代码返回的是 DataFrame 类型,同样你也可以通过传递一个单值list来返回一个 DataFrame 类型的数据
当然也可以使用 loc 对列进行选择,同时可以选择对列使用 " : "进行切片选择,效果如图:
同时,你还可以使用 " : " 对下标进行切片选择,例如 data.loc['Bruch':'Julio']
会选择从下标为'Bruch'到下标为'Julio' 的所有行,例如:
# 选择下标值为'Andrade' 和 'Veness',并且从'city'到'email'的所有列
data.loc[['Andrade', 'Veness'], ['city':'email']]
# 选择和之前相同的行,但只选择'first_name', 'address' 和 'city'这3列
data.loc['Andrade':'Veness', ['first_name', 'address', 'city']]
# 将下标切换为'id'
data.set_index('id', inplace=True) # 在原有数据源上修改
# 选择下标('id')= 487 的行
data.loc[487]
注意:最后一行代码:data.loc[487] 不等价于 data.iloc[487], 前者是选择 'id' = 487 的行,而后者是选择第488行,DataFrame的索引可以是数字顺序的,也可以是字符串或多值的。
使用Boolean / 逻辑判断选择数据
使用 boolean 数组进行条件选择是较为常用的手段,使用boolean下标或者逻辑表达式,你可以传递给 loc 一个值为 True/False 的Series或者数组来选择那些 Series或者数组中值为 True 的行。
较多情况下,语句 data["first_name" == 'Antonio']
会返回一个值为 True/False 的 Series 类型数据,其中 "True" 代表这一行中的 "first_name" 值为 "Antonio",这些 boolean数组可以直接如图所示传递给 loc 方法:
和之前一样,可以传递给 loc 第2个"参数"用来选择某些列,可以是列举的列名,也可以是用 " : " 切片的连续列,如图:
同样要注意:如果只选择了单独的一列,返回的是 Series 类型,同样传递一个单值list可以返回 DataFrame 类型,如图:
通过以下代码可以很好的理解 loc 的使用:
# 选择 first_name 为Antonio,并且从 'city' 到 'email'的所有列
data.loc[data['first_name'] == 'Antonio', 'city':'email']
# 选择那些 email的值中是以 "hotmail.com" 结尾的行,同时选择所有列
data.loc[data['email'].str.endswith("hotmail.com")]
# 选择那些 "last_name" 等于某些值的行
data.loc[data['first_name'].isin(['France', 'Tyisha', 'Eric'])]
# 选择 first_name = 'Antonio' 并且 email 是以 "gmail.com"结尾的行
data.loc[data['email'].str.endswith("gmail.com") & (data['first_name'] == 'Antonio')]
# select rows with id column between 100 and 200, and just return 'postal' and 'web' columns
# 选择那些 id 从100到200的行,并且只返回 'postal' 和 'web' 这两列
data.loc[(data['id'] > 100) & (data['id'] <= 200), ['postal', 'web']]
# lambda函数产生的 True/False 同样可以使用到 loc 中
# 选择那些公司名为4个单词的行
data.loc[data['company_name'].apply(lambda x: len(x.split(' ')) == 4)]
# 为了代码更加清晰, 选择也可以在 .loc 之外进行
# 在 .loc 之外单独生成一个变量
idx = data['company_name'].apply(lambda x: len(x.split(' ')) == 4)
# 只选择 idx 值为True的那些行,并且只选择'email', 'first_name', 'company'这3列
data.loc[idx, ['email', 'first_name', 'company']]
顺便说一下Pandas中 map(), apply() 和 applymap()的区别
-
map()
是 Series 中的函数,DataFrame 中是没有map()
的,map()
将函数应用于Series中的每一个元素 -
apply()
和applymap()
是 DataFrame 中的函数,而在Series中是没有的。他们的区别在于:apply()
将函数作用于DataFrame中的 每一个行或者列,而applymap()
会将函数作用于DataFrame中的 每一个元素。
使用 loc 修改 DataFrame 中的数据
你可以像使用 loc 查询数据那样对数据进行修改,这个操作不会返回新的数据对象而是直接在原数据上进行修改。通过这个操作,你可以根据不同的情况对数据进行修改:
# 修改 'id' > 2000 的数据中的 'first_name' 为 "John"
data.loc[data['id'] > 2000, "first_name"] = "John"
使用 ix 进行选择
现在pandas官方已经不推荐使用 ix 进行选择了,并且将会在 0.20.1版本从Pandas中丢弃
作者:danielAck
链接:https://www.jianshu.com/p/d6a9845a0a34
相关推荐
主要介绍了详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Pandas库中有iloc和loc以及ix可以用来索引数据,抽取数据。但是方法一多也容易造成混淆。下面将一一来结合代码说清其中的区别。 1. iloc和loc的区别: iloc主要使用数字来索引数据,而不能使用字符型的标签来索引...
### 详解 Pandas 中 iloc, loc 和 ix 的区别与联系 #### 一、引言 在使用 Pandas 进行数据分析时,我们经常会遇到数据筛选的问题,即如何有效地选择 DataFrame 中的部分数据。Pandas 提供了多种选择数据的方式,...
但是最近由于版本的问题,从之前的Python2.7改用Python3.6 了,在3.6中提供了loc和iloc两种索引方法,把ix这个方法给划分开来了,所以很有必要做个总结和对比。 loc——通过行标签索引行数据 iloc——通过行号...
在处理这些数据时,我们常常需要查询特定的行或列,pandas为此提供了多种查询方法,包括使用方括号、loc、iloc、at、iat和ix等。 首先,使用方括号对DataFrame进行切片是一种非常直观和简单的方法。这种方式有点...
pandas中一个很便捷的使用方法通过loc、iloc、ix等索引方式,这里记录一下: df.loc[条件,新增列] = 赋初始值 如果新增列名为已有列名,则在原来的数据列上改变 import pandas as pd import numpy as np data = pd....
由于ix的这种复杂性,推荐在新的代码中使用loc和iloc来避免潜在的问题。loc更适合于基于标签的选择,而iloc则适用于基于位置的选择。这样可以使代码更加清晰且易于理解。 在进行Pandas数据处理时,理解这些选择器的...
Pandas库提供了多种方法来查看和访问DataFrame对象中的数据,例如head、tail、loc、iloc、ix等方法。 八、结语 Pandas库中的DataFrame对象是一个非常强大和灵活的数据结构,提供了多种方法来读取、写入、转换、...
在Python的Pandas库中,DataFrame是一个非常重要的数据结构,用于处理二维表格数据。在处理DataFrame时,...在实际应用中,应尽量避免使用弃用的`.ix`,优先考虑使用`.loc`和`.iloc`,以保持代码的现代性和可维护性。
本文将详细介绍DataFrame中用于数据选取的六种方法:`df[]`、`df.loc[]`、`df.iloc[]`、`df.ix[]`、`df.at[]`和`df.iat[]`。 1. **行(列)选取:df[]** `df[]` 用于单一维度上的数据选取,即选取行或列。...
本文将详细介绍如何使用Pandas中的几个关键函数来筛选DataFrame中的数据,包括`loc`、`iloc`以及`ix`。 1. **普通方法筛选** - `df['A']` 和 `df.A` 都用于选取DataFrame中名为'A'的列。它们是等价的,返回一个...
3. **Indexing and Selecting Data**:如何选取、过滤和排序数据,如`.loc`、`.iloc`和`.ix`等方法的使用。 4. **Data Alignment**:Pandas自动对齐数据的能力,使得在数据操作时非常方便。 5. **Missing Data**:...
可以使用 loc、iloc、ix 等函数来选取数据。 数据集成是 pandas 中的重要功能,包括 concat、merge、join 等多种方式。可以使用 concat 函数来合并多个 DataFrame,使用 merge 函数来合并两个 DataFrame,使用 join...
索引行有三种方法,分别是 loc iloc ix import pandas as pd import numpy as np index = [a, b, c, d] data = np.random.randint(10, size=(4, 3)) df = pd.DataFrame(data, index=index) 0 1 2 a 9 7 1 b 0 0 7...