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。