如何將 Pandas DataFrame 列標題獲取為列表

Pandas 是用於 Python 資料分析的開源軟體包。pandas.DataFrame 是主要的 Pandas 資料結構。它是帶有標籤軸(行和列)的二維表格資料結構。

我們今天來介紹如何從 DataFrame 物件獲取列標題的列表。

我們將在本教程的所有其他程式碼示例中使用相同的如下面定義的 DataFrame 物件。

>>> import pandas
>>> cities = {
...   'name': ['New York', 'Los Angeles', 'Chicago'],
...   'population': [8601186, 4057841, 2679044],
...   'state': ['NY', 'CA', 'IL'],
... }
>>> data_frame = pandas.DataFrame(cities)

獲取 DataFrame 列名的一種方法是迭代 DataFrame 物件本身。DataFrame 迭代器按定義順序返回列名。

>>> for column in data_frame:
...   print(column)
...
name
population
state

當需要將可迭代物件轉換為列表時,可以在其上呼叫 Python 的內建 list 函式。

>>> list(data_frame)
['name', 'population', 'state']

但是,此方法的效能很慢。

>>> from timeit import timeit
>>> timeit(lambda: list(data_frame))
7.818843764999997

我們還可以從 DataFrame.columns 屬性訪問其列。

>>> list(data_frame.columns)
['name', 'population', 'state']

否則,我們可以使用 DataFrame.columns.tolist() 函式來實現相同的目的。

>>> data_frame.columns.tolist()
['name', 'population', 'state']

這兩種方法的效能都不是特別好。

>>> timeit(lambda: list(data_frame.columns))
7.143133517000024
>>> timeit(lambda: data_frame.columns.tolist())
6.064925153999866

遍歷 DataFrame.columns.values 屬性時,事情發生了很大變化。同樣,與 DataFrame 物件和 DataFrame.columns 屬性一樣,我們可以使用它來獲取一系列 DataFrame 列名。

>>> list(data_frame.columns.values)
['name', 'population', 'state']

與以前的方法相比,此方法的效能提高了 5 到 6 倍。

>>> timeit(lambda: list(data_frame.columns.values))
1.301724927000123

但是,如果使用內建 DataFrame.columns.values.tolist() 方法,則可以實現最佳執行時間。

>>> data_frame.columns.values.tolist()
['name', 'population', 'state']
>>> timeit(lambda: data_frame.columns.values.tolist())
0.6860591469999235

如我們所見,這種方法的效能比直接在 DataFrame 物件上進行迭代要好十倍。大多數讀者會對這種效能差異背後的原因感到好奇。

答案隱藏在 DataFrame.columns.values 屬性的資料型別中。這是一個 NumPy 陣列。NumPy 是用於科學計算的 Python 軟體包,維護人員會對其效能進行高度優化。

Pandas 構建在 NumPy 之上,並提供了方便的高階抽象。因此,在較低階別的 NumPy 資料結構上執行直接操作幾乎總是比在 Pandas 較高階別的資料結構上執行類似操作快。

相關文章 - Pandas DataFrame

  • 拆分 Pandas DataFrame
  • 在 Pandas DataFrame 中規範化一列
  • 相關文章 - Pandas DataFrame Column

  • 如何在 Pandas 中將 DataFrame 列轉換為日期時間
  • 在 Pandas DataFrame 中規範化一列