如何根据列值从数据框架中选择行

如何根据列值从数据框架中选择行

在这篇文章中,我们将介绍如何在Python中基于列值从DataFrame中选择行。

数据框架的行可以根据条件选择,就像我们使用SQL查询一样。本文以实例说明了实现这一目的的各种方法。

导入数据集进行演示

为了解释这个方法,我们创建了一个数据集,其中包含10个人在各种游戏中的得分数据。首先将数据集加载到Dataframe中并进行可视化。10个具有唯一玩家ID(Pid)的人玩了不同游戏ID(game_id)的不同游戏,每个游戏的得分都作为一个条目加入到表格中。有些玩家的分数没有被记录下来,因此表格中出现了NaN值。

注意:要获得所用的CSV文件,请点击这里。

import pandas as pd
 
df = pd.read_csv(r"__your file path__\example2.csv")
print(df)
Python

输出:

如何根据列值从数据框架中选择行?

dataset example2.csv

我们将根据列值从Dataframe中选择行,使用。

  • 布尔索引法
  • 位置索引法
  • 使用isin()方法
  • 使用Numpy.where()方法
  • 与其他方法的比较

方法1:布尔索引法

在这个方法中,对于一个指定的列条件,每一行都被检查为真/假。产生 “真 “的行将被考虑用于输出。这可以通过各种方式实现。使用的查询是选择Pid=’p01’列的行。

例子1:根据某一列的值从Pandas数据框架中选择行

在这个例子中,我们试图用平等运算符来选择那些在其列中有p01值的行。

# Choose entries with id p01
df_new = df[df['Pid'] == 'p01']
 
print(df_new)
Python

输出

如何根据列值从数据框架中选择行?

例子2:指定条件 “掩码 “变量

在这里,我们将看到Pandas按条件选择行,所选的行被分配到一个新的Dataframe中,旧Dataframe中的行的索引作为新Dataframe中的索引,列保持不变。

# condition mask
mask = df['Pid'] == 'p01'
 
# new dataframe with selected rows
df_new = pd.DataFrame(df[mask])
 
print(df_new)
Python

输出

如何根据列值从数据框架中选择行?

例子3:结合掩码和dataframes.values属性

这里的查询是要选择游戏ID为’g21’的行。

# condition with df.values property
mask = df['game_id'].values == 'g21'
 
# new dataframe
df_new = df[mask]
 
print(df_new)
Python

输出

如何根据列值从数据框架中选择行?

方法2:位置索引法

loc()和iloc()方法可以用来在Python中对数据帧进行分片。在loc()和iloc()的区别中,需要注意的是iloc()只接受整数指数,而loc()也可以接受布尔指数。

示例1:Pandas通过loc()方法根据列值选择行

掩码给出了布尔值作为每一行的索引,无论哪一行的值为真,都会出现在结果中。这里的查询是选择游戏ID为g21的记录。

# for boolean indexing
mask = df['game_id'].values == 'g21'
 
# using loc() method
df_new = df.loc[mask]
 
print(df_new)
Python

输出

如何根据列值从数据框架中选择行?

示例2:Pandas通过iloc()方法根据列值选择行

该查询与上面采取的查询相同。iloc()只接受整数作为参数,因此,掩码数组被作为参数传递给Numpy的flatnonzero()函数,该函数返回列表中值不为零(false)的索引。

# condition mask
mask = df['game_id'].values == 'g21'
print("Mask array :", mask)
 
# getting non zero indices
pos = np.flatnonzero(mask)
print("\nRows selected :", pos)
 
# selecting rows
df.iloc[pos]
Python

输出

如何根据列值从数据框架中选择行?

方法3:使用dataframe.query()方法

query()方法接受返回布尔值的表达式,处理Dataframe中的所有行,并返回带有选定行的结果Dataframe。

示例1:Pandas通过Dataframe.query()方法根据列值选择行

选择name=”Albert “的行

df.query('name=="Albert"')
Python

输出

如何根据列值从数据框架中选择行?

例子2:根据多列条件选择行

这个例子是为了证明像AND/OR这样的逻辑运算符可以用来检查多个条件。我们试图选择积分>50且玩家不是Albert的行。

df.query('points>50 & name!="Albert"')
Python

输出

如何根据列值从数据框架中选择行?

方法3:使用isin()方法

Dataframe的这个方法以一个可迭代的或系列的或另一个Dataframe为参数,检查Dataframe的元素是否存在于其中。评估为 “真 “的行会被考虑到结果中。

例子1: Pandas通过isin()方法基于列值选择行

选择列值在一个可迭代数组中的行

选择玩家为阿尔伯特、路易斯和约翰的那几行。

# Players to be selected
li = ['Albert', 'Louis', 'John']
 
df[df.name.isin(li)]
Python

输出

如何根据列值从数据框架中选择行?

示例2:选择列不等于一个值的行

平铺符号(~)提供了被评估表达式的否定。在这里,我们选择的是积分>50且球员不是阿尔伯特、路易斯和约翰的行。

# values to be present in selected rows
li = ['Albert', 'Louis', 'John']
 
# selecting rows from dataframe
df[(df.points > 50) & (~df.name.isin(li))]
Python

输出

如何根据列值从数据框架中选择行?

方法4:使用Numpy.where()方法

Numpy的where()函数可以和pandas的isin()函数结合起来,产生更快的结果。事实证明,numpy.where()产生的结果比上面使用的普通方法要快。

示例:Pandas通过np.where()方法基于列值选择行

import numpy as np
 
df_new = df.iloc[np.where(df.name.isin(li))]
Python

输出:

如何根据列值从数据框架中选择行?

方法5:与其他方法的比较

示例 1

在这个例子中,我们使用的是NumPy和pandas的混合方法

# to calculate timing
import numpy as np
% % timeit
 
 
# using mixture of numpy and pandas method
df_new = df.iloc[np.where(df.name.isin(li))]
Python

输出:

756微秒±132微秒/循环(7次运行的平均值±标准差,每次1000循环)

示例 2

在这个例子中,我们只使用了Pandas方法

# to calculate time
%%timeit
 
li=['Albert','Louis','John']
 
# Pandas method only
df[(df.points>50)&(~df.name.isin(li))]
Python

输出

1.7 ms ± 307 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册