如何根据列值从数据框中选择行?
先决条件: Python中的 Pandas.Dataframes
可以根据条件选择数据帧的行,就像我们使用 SQL 查询一样。本文通过示例说明了实现此目的的各种方法。为了解释该方法,我们创建了一个数据集,其中包含 10 人在各种游戏中得分的数据。数据集首先加载到数据框中并进行可视化。十个人具有唯一玩家 id ( Pid ) 玩了不同游戏 id ( game_id ) 的不同游戏,并将每场比赛的得分作为条目添加到表中。一些玩家的分数没有被记录,因此NaN值出现在表中。
注意:要获取使用的 CSV 文件,请单击此处。
Python3
import pandas as pd
df=pd.read_csv(r"__your file path__\example2.csv")
print(df)
Python3
# Choose entries with id p01
df_new = df[df['Pid'] == 'p01']
print(df_new)
Python3
# condition mask
mask = df['Pid'] == 'p01'
# new dataframe with selected rows
df_new = pd.DataFrame(df[mask])
print(df_new)
Python3
# condition with df.values property
mask = df['game_id'].values == 'g21'
# new dataframe
df_new = df[mask]
print(df_new)
Python3
# for boolean indexing
mask = df['game_id'].values == 'g21'
# using loc() method
df_new = df.loc[mask]
print(df_new)
Python3
# 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]
Python3
df.query('name=="Albert"')
Python3
df.query('points>50 & name!="Albert"')
Python3
#Players to be selected
li=['Albert','Louis','John']
df[df.name.isin(li)]
Python3
# values to be present in selected rows
li = ['Albert', 'Louis', 'John']
# selecting rows from dataframe
df[(df.points > 50) & (~df.name.isin(li))]
Python3
import numpy as np
df_new = df.iloc[np.where(df.name.isin(li))]
Python3
# 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))]
Python3
# to calculate time
%%timeit
li=['Albert','Louis','John']
# Pandas method only
df[(df.points>50)&(~df.name.isin(li))]
输出:
布尔索引法
在此方法中,对于指定的列条件,检查每一行的真/假。产生True的行将被考虑用于输出。这可以通过多种方式实现。使用的查询是Select rows where the column Pid='p01'
示例 1:索引时检查条件
蟒蛇3
# Choose entries with id p01
df_new = df[df['Pid'] == 'p01']
print(df_new)
输出
示例 2:指定条件 'mask' 变量
所选行被分配给新数据帧,旧数据帧中的行索引作为新数据帧的索引,列保持不变。
蟒蛇3
# condition mask
mask = df['Pid'] == 'p01'
# new dataframe with selected rows
df_new = pd.DataFrame(df[mask])
print(df_new)
输出
示例 3:结合 mask 和 dataframes.values 属性
这里的查询是Select the rows with game_id 'g21' 。
蟒蛇3
# condition with df.values property
mask = df['game_id'].values == 'g21'
# new dataframe
df_new = df[mask]
print(df_new)
输出
位置索引
loc() 和 iloc()方法可用于在Python中对数据帧进行切片。在 loc() 和 iloc() 之间的区别中,需要注意的重要一点是iloc()仅采用整数索引,而loc()也可以采用布尔索引。
示例 1:使用 loc()
掩码将布尔值作为每行的索引,并且任何评估为 true 的行都将出现在结果中。在这里,查询是选择game_id 为 g21 的行。
蟒蛇3
# for boolean indexing
mask = df['game_id'].values == 'g21'
# using loc() method
df_new = df.loc[mask]
print(df_new)
输出
示例 2:使用 iloc()
查询与上面的查询相同。 iloc()只接受整数作为参数,因此,掩码数组作为参数传递给 numpy 的 flatnonzero()函数,该函数返回列表中值不为零(假)的索引
蟒蛇3
# 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]
输出
使用 dataframe.query()
查询() 方法采用返回布尔值的表达式,处理数据帧中的所有行,并返回包含选定行的结果数据帧。
示例 1:选择 name="Albert" 的行
蟒蛇3
df.query('name=="Albert"')
输出
示例 2:选择点数>50 且玩家不是 Albert 的行。
此示例是为了演示AND/OR等逻辑运算符可用于检查多个条件。
蟒蛇3
df.query('points>50 & name!="Albert"')
输出
使用 isin()
这种数据帧的方法以一个可迭代的或一个系列或另一个数据帧为参数,并检查其中是否存在该数据帧的元素。计算结果为真的行被视为结果。
示例 1:选择玩家为 Albert、Louis 和 John 的行。
蟒蛇3
#Players to be selected
li=['Albert','Louis','John']
df[df.name.isin(li)]
输出
示例 2:选择分数>50 且玩家不是 Albert、Louis 和 John 的行。
平铺符号 (~) 提供所评估表达式的否定。
蟒蛇3
# values to be present in selected rows
li = ['Albert', 'Louis', 'John']
# selecting rows from dataframe
df[(df.points > 50) & (~df.name.isin(li))]
输出
使用 np.where()
numpy 的where()函数可以与 pandas 的isin()函数结合使用以产生更快的结果。 numpy.where() 被证明比上面使用的正常方法更快地产生结果。
例子:
蟒蛇3
import numpy as np
df_new = df.iloc[np.where(df.name.isin(li))]
输出
与其他方法的比较
蟒蛇3
# 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))]
输出:
756 µs ± 132 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
蟒蛇3
# to calculate time
%%timeit
li=['Albert','Louis','John']
# Pandas method only
df[(df.points>50)&(~df.name.isin(li))]
输出
1.7 ms ± 307 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)