如何根据 Pandas 中的列值过滤 DataFrame 行

Suraj Joshi 2023年1月30日 2020年6月9日
  1. 根据特定的列值选择 Pandas 行
  2. 选择不包含特定列值的 Pandas 行
  3. 选择列值大于或小于特定值的 Pandas 行
  4. 根据多个列值选择 Pandas 行
  5. 选择具有多个条件的 DataFrame 行
如何根据 Pandas 中的列值过滤 DataFrame 行

我们可以根据单列或多列值选择 DataFrame 的行。我们也可以从 DataFrame 中获得满足或不满足一个或多个条件的行。这可以通过布尔索引,位置索引,标签索引和 query()方法来实现。

根据特定的列值选择 Pandas 行

我们可以从包含或不包含列的特定值的 DataFrame 中选择 Pandas 行。它广泛用于根据列值过滤 DataFrame。

选择包含特定列值的 Pandas 行

使用布尔索引进行过滤

在布尔索引中,我们首先生成一个掩码,该掩码只是表示该列是否包含特定元素的一系列布尔值。

df_mask=df['col_name']=='specific_value'

然后,我们将此掩码应用于原始 DataFrame 以过滤所需的值。

filtered_df = df[df_mask]

这将返回过滤后的 DataFrame,该 DataFrame 仅包含具有 col_name 列的 specific_value 值的行。

import pandas as pd

dates=['April-10', 'April-11', 'April-12', 'April-13','April-14','April-16']
sales=[200,300,400,200,300,300]
prices=[3, 1, 2, 4,3,2]

df = pd.DataFrame({'Date':dates ,
                   'Sales':sales ,
                   'Price': prices})

df_mask=df['Sales']==300
filtered_df = df[df_mask]
print(filtered_df)

输出:

       Date  Sales  Price
1  April-11    300      1
4  April-14    300      3
5  April-16    300      2

这将给出 df 中所有销售额为 300 的行。

使用位置索引进行过滤

它与布尔索引相似,但是要多做一步。在这种方法中,我们首先创建一个布尔掩码,然后找到布尔掩码具有真值的位置。然后,我们将掩码中所有值为 True 的位置传递给 iloc() 方法,以便仅选择所有需要的行。

import pandas as pd
import numpy as np

dates=['April-10', 'April-11', 'April-12', 'April-13','April-14','April-16']
sales=[200,300,400,200,300,300]
prices=[3, 1, 2, 4,3,2]

df = pd.DataFrame({'Date':dates ,
                   'Sales':sales ,
                   'Price': prices})

df_mask=df['Sales']==300
positions = np.flatnonzero(df_mask)
filtered_df=df.iloc[positions]
print(filtered_df)

输出:

       Date  Sales  Price
1  April-11    300      1
4  April-14    300      3
5  April-16    300      2

这也会给出 df 中所有销售值是 300 的行。

Pandas Chaining

我们还可以使用 Pandas Chaining 来按列值过滤 pandas.DataFrame 过滤器。在这种方法中,我们使用 pandas.DataFrame.eq() 方法,将检查其值以比较 DataFrame 中按元素的相等性。

import pandas as pd
import numpy as np

dates=['April-10', 'April-11', 'April-12', 'April-13','April-14','April-16']
sales=[200,300,400,200,300,300]
prices=[3, 1, 2, 4,3,2]

df = pd.DataFrame({'Date':dates ,
                   'Sales':sales ,
                   'Price': prices})

filtered_df = df[df.Sales.eq(300)]
print(filtered_df)

输出:

       Date  Sales  Price
1  April-11    300      1
4  April-14    300      3
5  April-16    300      2

pandas.DataFrame.query()

我们可以使用 pandas.DataFrame.query() 在列中按列值选择 Pandas 行。

import pandas as pd
import numpy as np

dates=['April-10', 'April-11', 'April-12', 'April-13','April-14','April-16']
sales=[200,300,400,200,300,300]
prices=[3, 1, 2, 4,3,2]

df = pd.DataFrame({'Date':dates ,
                   'Sales':sales ,
                   'Price': prices})

filtered_df = df.query('Sales == 300')
print(filtered_df)

输出:

       Date  Sales  Price
1  April-11    300      1
4  April-14    300      3
5  April-16    300      2

如果我们希望更新现有的 DataFrame,可以在查询方法中设置 inplace=True

选择不包含特定列值的 Pandas 行

选择不包含特定列值的 Pandas 行的方法与选择具有特定列值的 Pandas 行的方法类似。我们唯一需要更改的是条件,即在创建掩码或查询时,仅将 == 替换为!= 即可使该列不包含特定值。

import pandas as pd

dates=['April-10', 'April-11', 'April-12', 'April-13','April-14','April-16']
sales=[200,300,400,200,300,300]
prices=[3, 1, 2, 4,3,2]

df = pd.DataFrame({'Date':dates ,
                   'Sales':sales ,
                   'Price': prices})

df_mask=df['Sales']!=300
filtered_df = df[df_mask]
print(filtered_df)

输出:

       Date  Sales  Price
0  April-10    200      3
2  April-12    400      2
3  April-13    200      4

这将选择销售值不是 300 的所有 df 行。

选择列值大于或小于特定值的 Pandas 行

要选择列值大于或小于特定值的 Pandas 行,在创建遮罩或查询时,请使用诸如 ><=>= 之类的运算符。

import pandas as pd

dates=['April-10', 'April-11', 'April-12', 'April-13','April-14','April-16']
sales=[200,300,400,200,300,300]
prices=[3, 1, 2, 4,3,2]

df = pd.DataFrame({'Date':dates ,
                   'Sales':sales ,
                   'Price': prices})

df_mask=df['Sales']>=300
filtered_df = df[df_mask]
print(filtered_df)

输出:

       Date  Sales  Price
1  April-11    300      1
2  April-12    400      2
4  April-14    300      3
5  April-16    300      2

这将导致 DataFrame 的 Sales 值大于或等于 300

根据多个列值选择 Pandas 行

我们介绍了根据 DataFrame 中列的特定值选择行的方法。在本节中,我们将讨论基于多个列值选择 Pandas 行的方法。

选择包含多个列值之一的 Pandas 行

要选择包含多个列值之一的 Pandas 行,我们使用 pandas.DataFrame.isin(values),该方法返回布尔值的 DataFrame,该布尔值表示 DataFrame 中的每个元素是否包含在值中。这样获得的布尔值的 DataFrame 可用于选择行。

import pandas as pd

dates=['April-10', 'April-11', 'April-12', 'April-13','April-14','April-16']
sales=[200,300,400,200,300,300]
prices=[3, 1, 2, 4,3,2]

df = pd.DataFrame({'Date':dates ,
                   'Sales':sales ,
                   'Price': prices})

values=[200,400]
filtered_df = df[df.Sales.isin(values)]
print(filtered_df)

输出:

       Date  Sales  Price
0  April-10    200      3
2  April-12    400      2
3  April-13    200      4

它将 DataFrame 的 Sales 值为 200400 的所有行中过滤掉。

选择不包含多个指定列值之一的 Pandas 行

要选择不包含多个指定列值中任何一个的 DataFrame 的行,我们将通过在前面放置~符号来将从 pandas.DataFrame.isin(values) 返回的 booleansDataFrame 取反。

import pandas as pd

dates=['April-10', 'April-11', 'April-12', 'April-13','April-14','April-16']
sales=[200,300,400,200,300,300]
prices=[3, 1, 2, 4,3,2]

df = pd.DataFrame({'Date':dates ,
                   'Sales':sales ,
                   'Price': prices})

values=[200,400]
filtered_df = df[~df.Sales.isin(values)]
print(filtered_df)

输出:

       Date  Sales  Price
1  April-11    300      1
4  April-14    300      3
5  April-16    300      2

它从 DataFrame 中过滤所有销售额值既不是 200 也不是 400 的行。

选择具有多个条件的 DataFrame 行

如果我们要考虑多列的行值来过滤行,则要创建多个条件,并将它们与 & 运算符组合。现在,仅当满足所有列的条件时才选择该行。

import pandas as pd

dates=['April-10', 'April-11', 'April-12', 'April-13','April-14','April-16']
sales=[200,300,400,200,300,300]
prices=[3, 1, 2, 4,3,2]

df = pd.DataFrame({'Date':dates ,
                   'Sales':sales ,
                   'Price': prices})

values_1=[200,400]
values_2=[2,3]
filtered_df = df[df.Sales.isin(values_1)&~df.Price.isin(values_2)]
print(filtered_df)

输出:

       Date  Sales  Price
3  April-13    200      4

它从销售值为 200400 且价格为 23 的 DataFrame 中过滤所有行。输出中的行仅满足整个 DataFrame 中的两个条件。

Author: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn

相关文章 - Pandas DataFrame

相关文章 - Pandas DataFrame Row