如何根據 Pandas 中的列值過濾 DataFrame 行
- 根據特定的列值選擇 Pandas 行
- 選擇不包含特定列值的 Pandas 行
- 選擇列值大於或小於特定值的 Pandas 行
- 根據多個列值選擇 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
值為 200
或 400
的所有行中過濾掉。
選擇不包含多個指定列值之一的 Pandas 行
要選擇不包含多個指定列值中任何一個的 DataFrame 的行,我們將通過在前面放置~
符號來將從 pandas.DataFrame.isin(values)
返回的 booleans
的 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
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
它從銷售值為 200
或 400
且價格為 2
或 3
的 DataFrame 中過濾所有行。輸出中的行僅滿足整個 DataFrame 中的兩個條件。
Suraj Joshi is a backend software engineer at Matrice.ai.
LinkedIn相關文章 - Pandas DataFrame
- 如何將 Pandas DataFrame 列標題獲取為列表
- 如何刪除 Pandas DataFrame 列
- 如何在 Pandas 中將 DataFrame 列轉換為日期時間
- 如何在 Pandas DataFrame 中將浮點數轉換為整數
- 如何按一列的值對 Pandas DataFrame 進行排序
- 如何用 group-by 和 sum 獲得 Pandas 總和