如何根据列值从数据框架中选择行
在这篇文章中,我们将介绍如何在Python中基于列值从DataFrame中选择行。
数据框架的行可以根据条件选择,就像我们使用SQL查询一样。本文以实例说明了实现这一目的的各种方法。
导入数据集进行演示
为了解释这个方法,我们创建了一个数据集,其中包含10个人在各种游戏中的得分数据。首先将数据集加载到Dataframe中并进行可视化。10个具有唯一玩家ID(Pid)的人玩了不同游戏ID(game_id)的不同游戏,每个游戏的得分都作为一个条目加入到表格中。有些玩家的分数没有被记录下来,因此表格中出现了NaN值。
注意:要获得所用的CSV文件,请点击这里。
输出:
dataset example2.csv
我们将根据列值从Dataframe中选择行,使用。
- 布尔索引法
- 位置索引法
- 使用isin()方法
- 使用Numpy.where()方法
- 与其他方法的比较
方法1:布尔索引法
在这个方法中,对于一个指定的列条件,每一行都被检查为真/假。产生 “真 “的行将被考虑用于输出。这可以通过各种方式实现。使用的查询是选择Pid=’p01’列的行。
例子1:根据某一列的值从Pandas数据框架中选择行
在这个例子中,我们试图用平等运算符来选择那些在其列中有p01值的行。
输出
例子2:指定条件 “掩码 “变量
在这里,我们将看到Pandas按条件选择行,所选的行被分配到一个新的Dataframe中,旧Dataframe中的行的索引作为新Dataframe中的索引,列保持不变。
输出
例子3:结合掩码和dataframes.values属性
这里的查询是要选择游戏ID为’g21’的行。
输出
方法2:位置索引法
loc()和iloc()方法可以用来在Python中对数据帧进行分片。在loc()和iloc()的区别中,需要注意的是iloc()只接受整数指数,而loc()也可以接受布尔指数。
示例1:Pandas通过loc()方法根据列值选择行
掩码给出了布尔值作为每一行的索引,无论哪一行的值为真,都会出现在结果中。这里的查询是选择游戏ID为g21的记录。
输出
示例2:Pandas通过iloc()方法根据列值选择行
该查询与上面采取的查询相同。iloc()只接受整数作为参数,因此,掩码数组被作为参数传递给Numpy的flatnonzero()函数,该函数返回列表中值不为零(false)的索引。
输出
方法3:使用dataframe.query()方法
query()方法接受返回布尔值的表达式,处理Dataframe中的所有行,并返回带有选定行的结果Dataframe。
示例1:Pandas通过Dataframe.query()方法根据列值选择行
选择name=”Albert “的行
输出
例子2:根据多列条件选择行
这个例子是为了证明像AND/OR这样的逻辑运算符可以用来检查多个条件。我们试图选择积分>50且玩家不是Albert的行。
输出
方法3:使用isin()方法
Dataframe的这个方法以一个可迭代的或系列的或另一个Dataframe为参数,检查Dataframe的元素是否存在于其中。评估为 “真 “的行会被考虑到结果中。
例子1: Pandas通过isin()方法基于列值选择行
选择列值在一个可迭代数组中的行
选择玩家为阿尔伯特、路易斯和约翰的那几行。
输出
示例2:选择列不等于一个值的行
平铺符号(~)提供了被评估表达式的否定。在这里,我们选择的是积分>50且球员不是阿尔伯特、路易斯和约翰的行。
输出
方法4:使用Numpy.where()方法
Numpy的where()函数可以和pandas的isin()函数结合起来,产生更快的结果。事实证明,numpy.where()产生的结果比上面使用的普通方法要快。
示例:Pandas通过np.where()方法基于列值选择行
输出:
方法5:与其他方法的比较
示例 1
在这个例子中,我们使用的是NumPy和pandas的混合方法
输出:
756微秒±132微秒/循环(7次运行的平均值±标准差,每次1000循环)
示例 2
在这个例子中,我们只使用了Pandas方法
输出
1.7 ms ± 307 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)