如何根據 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