如何将 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 转换为 Numpy 数组
  • 如何在 Pandas DataFrame 中添加一行
  • 相关文章 - Pandas DataFrame Column

  • 如何将 Python 词典转换为 Pandas DataFrame
  • 如何在 Pandas 中将 DataFrame 列转换为日期时间
  • comments powered by Disqus