HOWTO · Pandas

Pandas DataFrame 排除列

本教程講解了我們如何從 DataFrame 中獲取除某一列以外的所有列。

本頁內容

若要從 Pandas DataFrame 排除欄位,可用 drop() 直接移除指定標籤、用 loc 設定欄名條件,或在其排序方式符合需求時使用 Index.difference()。範例使用同一個股票資料表;每個程式碼範例都會自行建立資料,因此可獨立執行。

使用 loc 選取除某欄以外的所有欄位

搭配完整的列切片與欄標籤的布林條件使用 loc。列切片 : 會保留所有列;stocks_df.columns != "Sector" 對每個標籤不是 Sector 的欄位都會得到 True,因此只會保留這些欄位。loc 是用來選取列與欄的存取器,不是要加上括號呼叫的方法。選取語法請參閱「loc」屬性。

執行以下範例:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

import pandas as pd

stocks_df = pd.DataFrame(
    {
        "Stock": ["Amazon", "Tesla", "Facebook", "Boeing"],
        "Price(in $)": [3180, 835, 267, 209],
        "Sector": ["Technology", "Technology", "Technology", "Aircraft"],
    }
)

filtered_df = stocks_df.loc[:, stocks_df.columns != "Sector"]
print(filtered_df)

結果表格包含 Stock 和 Price(in $) 欄位。若要排除的欄位可用標籤規則表示,這種寫法就很實用;修改比較條件即可保留或移除其他指定欄位。

使用 drop() 排除一個或多個欄位

若要依標籤直接移除欄位,drop() 可接受 columns 引數。移除一個欄位時傳入字串;移除多個欄位時傳入字串清單。這種寫法能明確指出標籤是欄位名稱;等效的軸寫法是 drop(labels, axis=1)。依預設,drop() 會回傳新的 DataFrame,且不會變更 stocks_df;若之後要使用結果,請將它指定給變數。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

import pandas as pd

stocks_df = pd.DataFrame(
    {
        "Stock": ["Amazon", "Tesla", "Facebook", "Boeing"],
        "Price(in $)": [3180, 835, 267, 209],
        "Sector": ["Technology", "Technology", "Technology", "Aircraft"],
    }
)

without_sector = stocks_df.drop(columns="Sector")
without_sector_and_price = stocks_df.drop(columns=["Sector", "Price(in $)"])
print(without_sector)
print(without_sector_and_price)

第一個結果保留 Stock 和 Price(in $);第二個結果只保留 Stock。兩個操作都以原始資料表為起點,因為依預設,這兩次呼叫都不會修改原表。若要一次移除多個標籤,請使用清單寫法。

使用 Index.difference() 排除欄位

Index.difference() 會從欄標籤 Index 中扣除指定要排除的標籤。接著可用產生的 Index 選取欄位。依預設,difference() 會排序回傳的標籤,因此即使保留欄位中的資料都沒有改變,結果表格的欄位順序仍可能與來源不同。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

import pandas as pd

stocks_df = pd.DataFrame(
    {
        "Stock": ["Amazon", "Tesla", "Facebook", "Boeing"],
        "Price(in $)": [3180, 835, 267, 209],
        "Sector": ["Technology", "Technology", "Technology", "Aircraft"],
    }
)

remaining_columns = stocks_df.columns.difference(["Sector"])
filtered_df = stocks_df[remaining_columns]
print(filtered_df)

此處剩餘的標籤依字母順序排列,因此 Price(in $) 會排在 Stock 前面,與原始 DataFrame 的欄位順序不同。若需要保留來源欄位順序,請優先使用 drop() 或上方的 loc 條件,不要依賴預設會排序的差集結果。

選擇適合的欄位排除方式

已知要移除哪些標籤,而且想用最直接的寫法時,請選擇 drop();無論一個標籤或多個標籤,都可使用它的 columns 引數。若保留或移除欄位的規則取決於欄名,請選擇 loc,因為布林遮罩能清楚呈現選取條件。若集合式扣除方式符合需求,而且預設的標籤排序可以接受,則可選擇 Index.difference()。

這三種方式都會從同一個 DataFrame 選取欄位,但採用的規則不同:drop() 使用明確標籤,loc 使用布林條件,Index.difference() 則使用 Index 扣除。若後續程式依賴欄位位置,請確認結果的欄位順序。一般要依名稱移除欄位時,drop(columns=...) 通常是最清楚的起點。