HOWTO · Pandas

獲取 Dataframe Pandas 的第一行

學習使用 iloc、head()、篩選、query()、take() 與切片選取 Pandas DataFrame 的第一列,並選擇要取得 Series 還是 DataFrame 結果。

本頁內容

使用 df.iloc[0] 可將第一列取回為 Series;使用 df.head(1) 則會保留為只有一列的 DataFrame。若要取得符合條件的第一列,請先篩選,再選取篩選結果的第一筆。

範例使用小型 DataFrame,方便查看選取的值與原始列索引標籤。每個程式碼區塊都可獨立執行,執行環境需安裝 pandas;下方顯示的是所提供執行中的觀察輸出。

使用 pandas.DataFrame.iloc 屬性取得 Pandas DataFrame 的第一列

pandas.DataFrame.iloc 會依整數位置選取列與欄。位置 0 代表第一列,不受索引標籤影響。使用 df.iloc[0] 選取一列會回傳 Series,其索引包含 DataFrame 的欄名。使用 df.iloc[0, 1] 可選取第 0 列、第 1 欄的單一值。

import pandas as pd

df = pd.DataFrame(
    {
        "C_1": ["A", "B", "C", "D"],
        "C_2": [40, 34, 38, 45],
        "C_3": [430, 980, 200, 350],
    }
)

first_row = df.iloc[0]
print(first_row)
C_1      A
C_2     40
C_3    430
Name: 0, dtype: object

若後續計算或依欄名存取資料時,Series 很方便,就可以使用這種寫法。若要保留二維的 DataFrame 形狀,請使用 df.iloc[[0]] 或下方介紹的方法。

使用 pandas.DataFrame.head() 方法取得 Pandas DataFrame 的第一列

pandas.DataFrame.head(n) 會以 DataFrame 形式回傳前 n 列。傳入 1 就只會保留第一列,同時保留欄位結構與索引標籤。後續程式碼需要 DataFrame 時,這通常是最清楚的選擇。

import pandas as pd

df = pd.DataFrame(
    {
        "C_1": ["A", "B", "C", "D"],
        "C_2": [40, 34, 38, 45],
        "C_3": [430, 980, 200, 350],
    }
)

first_row = df.head(1)
print(first_row)
  C_1  C_2  C_3
0   A   40  430

選擇時的關鍵在於回傳形狀:df.iloc[0] 是一維資料,而 df.head(1) 仍是 DataFrame。

根據指定條件取得 Pandas DataFrame 的第一列

請先篩選列,再選取第一筆符合條件的資料。此範例的條件是 C_2 < 40 和 C_3 > 450;第一筆符合條件的列,其索引標籤為 1。布林遮罩會在每個比較式外加上括號,因為 & 用來合併這兩個條件。

import pandas as pd

df = pd.DataFrame(
    {
        "C_1": ["A", "B", "C", "D"],
        "C_2": [40, 34, 38, 45],
        "C_3": [430, 980, 500, 350],
    }
)

matches = df[(df["C_2"] < 40) & (df["C_3"] > 450)]
first_match = matches.head(1)
print(first_match)
  C_1  C_2  C_3
1   B   34  980

如果沒有任何列符合條件,head(1) 會回傳空的 DataFrame。若有符合項目時需要單一 Series,請使用 matches.iloc[0];如果條件可能找不到符合項目,請先檢查 matches.empty。

query() 方法可用字串表示相同的篩選條件,適合用來撰寫易讀的欄位運算式。請讓這裡的條件與布林篩選範例一致:

import pandas as pd

df = pd.DataFrame(
    {
        "C_1": ["A", "B", "C", "D"],
        "C_2": [40, 34, 38, 45],
        "C_3": [430, 980, 500, 350],
    }
)

matches = df.query("(C_2 < 40) & (C_3 > 450)")
first_match = matches.head(1)
print(first_match)
  C_1  C_2  C_3
1   B   34  980

若要在 query() 運算式中使用 Python 變數的值,請寫成 @variable。例如,limit = 40 可在 df.query("C_2 < @limit") 中引用。

使用 pandas.DataFrame.take() 方法取得 Pandas DataFrame 的第一列

使用預設的列軸時,pandas.DataFrame.take() 會依位置選取列。傳入 [0] 可將第一列選取為只有一列的 DataFrame,並保留其原始索引標籤。

import pandas as pd

df = pd.DataFrame(
    {
        "C_1": ["A", "B", "C", "D"],
        "C_2": [40, 34, 38, 45],
        "C_3": [430, 980, 200, 350],
    }
)

first_row = df.take([0])
print(first_row)
  C_1  C_2  C_3
0   A   40  430

如果已有列位置清單,可以使用 take()。若只是要選取第一列,head(1) 或 iloc[[0]] 通常能更直接地表達意圖。

使用切片取得 Pandas DataFrame 的第一列

切片 df[:1] 會從開頭選取資料,直到位置 1 為止,但不包含位置 1。它會回傳 DataFrame,並保留所選列的索引標籤。

import pandas as pd

df = pd.DataFrame(
    {
        "C_1": ["A", "B", "C", "D"],
        "C_2": [40, 34, 38, 45],
        "C_3": [430, 980, 200, 350],
    }
)

first_row = df[:1]
print(first_row)
  C_1  C_2  C_3
0   A   40  430

結論

若需要 Series,請使用 df.iloc[0];若需要只有一列的 DataFrame,則可使用 df.head(1)、df.iloc[[0]]、df.take([0]) 或 df[:1]。若要取得符合條件的第一列,請使用布林條件或 query() 篩選,再選取篩選結果的第一列。如果可能沒有符合項目,請在索引取值前檢查 matches.empty。