HOWTO · Pandas

如何獲取 Pandas DataFrame 的行數

學習如何使用 `shape`、`len()` 和索引取得 Pandas DataFrame 的列數,分辨列數與欄數,並計算符合條件的列數。

本頁內容

若要取得 Pandas DataFrame 的列數,請使用 df.shape[0] 或 len(df)。shape 屬性會回傳兩個維度:第一個值是列數,第二個值是欄數。若只要計算符合某項條件的列,請將布林遮罩加總。

使用 DataFrame.shape 取得列數與欄數

DataFrame.shape 是一個屬性,會依照 (列數, 欄數) 的順序回傳一個元組。選取索引 0 可取得列數,選取索引 1 則可取得欄數。當你需要檢視這兩個維度,或想直接取得列數而不必計算特定欄中的值時,這個屬性就很有用。

以下範例會建立一個小型 DataFrame,並列印兩個維度:

import pandas as pd

data = {
    "Name": ["Alice", "Bob", "Charlie"],
    "Age": [25, 30, 35],
    "City": ["New York", "Los Angeles", "Chicago"],
}
df = pd.DataFrame(data)

print("Rows:", df.shape[0])
print("Columns:", df.shape[1])

若只需要列數,請使用 df.shape[0]。此時不要使用 df.shape[1]:它回傳的是欄數。如果表格剛好有三列和三欄,兩個數值會相同,容易讓人混淆。

使用 len() 或索引取得列數

將 DataFrame 傳入 Python 內建函式 len(),即可取得列數:len(df)。如果只需要列數,這種寫法簡潔明瞭。len(df.index) 會計算 DataFrame 列索引的長度,因此得到相同的列數;len(df.axes[0]) 則會取得列軸的長度。至於欄數,len(df.axes[1]) 對應的是 df.shape[1]。

這些寫法都會計算列數,不受索引標籤影響;它們不會計算所選欄中非缺失值的數量。若要計算不含缺失值的列,請先用 df.dropna() 篩選資料,再使用 len(df.dropna())。預設情況下,dropna() 會移除任一欄含有缺失值的列;若只要檢查特定欄,請傳入 subset=["Age"]。

不需要在 DataFrame 上呼叫 .len():len() 是 Python 函式,應寫成 len(df),而不是 df.len() 或 .len(df.index)。請在計數運算式中使用你要計算的那個 DataFrame,例如篩選後的 DataFrame。

計算符合條件的列數

先根據欄位比較結果建立布林遮罩,再對遮罩呼叫 .sum()。在布林 Series 中,每個 True 會計為一,每個 False 會計為零,因此加總結果就是符合條件的列數。這種向量化寫法適合單一比較,也能延伸至多項條件。

import pandas as pd

df = pd.DataFrame({"Name": ["Alice", "Bob", "Charlie"], "Age": [25, 30, 35]})
is_over_28 = df["Age"] > 28
matching_rows = is_over_28.sum()
print(matching_rows)

若要進行多項比較,請將每個比較式分別放在括號中,再使用 & 表示 AND,或使用 | 表示 OR。例如,(df["Age"] > 28) & (df["Age"] < 35) 會選出年齡同時符合兩個界限的列;將產生的遮罩加總即可取得列數。不要在整個 Pandas Series 之間使用 Python 的 and 或 or。

若要計算不重複列,請先移除重複資料,再計數:len(df.drop_duplicates())。這和計算所有列的結果不同,因為呼叫 drop_duplicates() 後,每筆重複記錄只會保留一次。請依照需求選擇運算式:計算所有列、符合篩選條件的列,或不重複的記錄。