从Pandas DataFrame列标题获取列表

我想从Pandas DataFrame中获取列标题的列表。DataFrame将来自用户输入,所以我不知道会有多少列或它们将被称为什么。

例如,如果给我一个这样的DataFrame:

>>> my_dataframey  gdp  cap0   1    2    51   2    3    92   8    7    23   3    4    74   6    7    75   4    8    36   8    2    87   9    9   108   6    6    49  10   10    7

我会得到一个这样的列表:

>>> header_list['y', 'gdp', 'cap']
2076732 次浏览

这是可用的my_dataframe.columns

您可以通过执行以下操作将值作为列表获取:

list(my_dataframe.columns.values)

您也可以简单地使用(如Ed Chum的回答所示):

list(my_dataframe)
n = []for i in my_dataframe.columns:n.append(i)print n

有一个内置的方法是最高性能的:

my_dataframe.columns.values.tolist()

.columns返回一个Index.columns.values返回一个数组,这有一个帮助函数.tolist返回一个列表。

如果性能对你来说不那么重要,Index对象定义了一个.tolist()方法,你可以直接调用:

my_dataframe.columns.tolist()

性能上的差异是显而易见的:

%timeit df.columns.tolist()16.7 µs ± 317 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit df.columns.values.tolist()1.24 µs ± 12.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

对于那些讨厌打字的人,你可以在df上调用list,如下所示:

list(df)

A数据帧遵循了迭代对象“键”的类似字典的约定。

my_dataframe.keys()

创建键/列列表-对象方法to_list()和Pythonic方式:

my_dataframe.keys().to_list()list(my_dataframe.keys())

DataFrame上的基础迭代返回列标签:

[column for column in my_dataframe]

不要只是为了获取列标签而将DataFrame转换为列表。在寻找方便的代码示例时,不要停止思考。

xlarge = pd.DataFrame(np.arange(100000000).reshape(10000,10000))list(xlarge) # Compute time and memory consumption depend on dataframe size - O(N)list(xlarge.keys()) # Constant time operation - O(1)

我做了一些快速测试,也许毫不奇怪,使用dataframe.columns.values.tolist()的内置版本是最快的:

In [1]: %timeit [column for column in df]1000 loops, best of 3: 81.6 µs per loop
In [2]: %timeit df.columns.values.tolist()10000 loops, best of 3: 16.1 µs per loop
In [3]: %timeit list(df)10000 loops, best of 3: 44.9 µs per loop
In [4]: % timeit list(df.columns.values)10000 loops, best of 3: 38.4 µs per loop

(我仍然非常喜欢list(dataframe),所以谢谢edchum!)

它变得更简单(由Pandas 0.16.0):

df.columns.tolist()

会给你一个漂亮的列表中的列名。

>>> list(my_dataframe)['y', 'gdp', 'cap']

要在调试器模式下列出数据框的列,请使用列表推导:

>>> [c for c in my_dataframe]['y', 'gdp', 'cap']

顺便说一句,您可以通过使用sorted简单地获得排序列表:

>>> sorted(my_dataframe)['cap', 'gdp', 'y']

这很有趣,但是df.columns.values.tolist()几乎比df.columns.tolist()快三倍,但我认为它们是一样的:

In [97]: %timeit df.columns.values.tolist()100000 loops, best of 3: 2.97 µs per loop
In [98]: %timeit df.columns.tolist()10000 loops, best of 3: 9.67 µs per loop

在笔记本

对于IPython笔记本中的数据探索,我的首选方式是:

sorted(df)

这将产生一个易于阅读的按字母顺序排列的列表。

在代码存储库中

在代码中,我发现这样做更明确

df.columns

因为它告诉其他人阅读你的代码你在做什么。

我觉得这个问题值得一个额外的解释。

已确认所示,答案取决于您在项目中使用的Pandas版本。您可以使用pd.__version__命令获取。

如果您出于某种原因像我一样(在debian8(Jessie)上我使用0.14.1)使用比0.16.0更旧的Pandas版本,那么您需要使用:

df.keys().tolist(),因为还没有实现任何df.columns方法。

这种key方法的优点是它甚至可以在较新版本的Pandas中工作,因此它更通用。

由Simeon Visser回答你可以做

list(my_dataframe.columns.values)

list(my_dataframe) # For less typing.

但我认为最甜蜜的地方是:

list(my_dataframe.columns)

它是明确的,同时也不是不必要的长。

为了快速,整洁,视觉检查,试试这个:

for col in df.columns:print col

尽管之前提供的解决方案很好,但我也希望frame.column_names()之类的东西成为Pandas中的函数,但由于它不是,也许使用以下语法会很好。通过调用“tolist”函数,它以某种方式保留了您以适当方式使用Pandas的感觉:frame.columns.tolist()

frame.columns.tolist()

扩展可迭代解包(Python 3.5+):[*df]和朋友

解包泛化(PEP 448)已经在Python 3.5中引入。因此,以下操作都是可能的。

df = pd.DataFrame('x', columns=['A', 'B', 'C'], index=range(5))df
A  B  C0  x  x  x1  x  x  x2  x  x  x3  x  x  x4  x  x  x

如果你想要一个list

[*df]# ['A', 'B', 'C']

如果你想要一个set

{*df}# {'A', 'B', 'C'}

如果你想要一个tuple

*df,  # Please note the trailing comma# ('A', 'B', 'C')

或者,如果您想将结果存储在某个地方,

*cols, = df  # A wild comma appears, againcols# ['A', 'B', 'C']

…如果你是那种将咖啡转换为打字声音的人,那么,这将更有效地消耗你的咖啡;)

附言:如果性能很重要,你会想要放弃上面的解决方案有利于

df.columns.to_numpy().tolist()# ['A', 'B', 'C']

这类似于Ed Chum的回答,但更新为v0.24,其中.to_numpy()优先于.values的使用。见这个答案(由我)获取更多信息。

视觉检查

由于我已经在其他答案中看到了这一点,您可以使用可迭代的解包(不需要显式循环)。

print(*df)A B C
print(*df, sep='\n')ABC

对其他方法的批评

对于可以在单行中完成的操作,不要使用显式的for循环(列表推导可以)。

接下来,使用sorted(df)并不能保持原有的秩序列。为此,您应该使用list(df)代替。

接下来,list(df.columns)list(df.columns.values)是糟糕的建议(截至当前版本v0.24)。Index(从df.columns返回)和NumPy数组(由df.columns.values返回)定义了.tolist()方法,该方法更快、更惯用。

最后,listify(即list(df))应该只用作上述Python 3.4或更早版本的方法的简明替代,因为扩展解包不可用。

%%timeitfinal_df.columns.values.tolist()948 ns ± 19.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%%timeitlist(final_df.columns)14.2 µs ± 79.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%%timeitlist(final_df.columns.values)1.88 µs ± 11.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%%timeitfinal_df.columns.tolist()12.3 µs ± 27.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%%timeitlist(final_df.head(1).columns)163 µs ± 20.6 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

如果DataFrame恰好有一个Index或MultiIndex,并且您也希望将它们包含为列名:

names = list(filter(None, df.index.names + df.columns.values.tolist()))

它避免了调用reset_index(),因为它对这样一个简单的操作有不必要的性能影响。

我经常遇到需要这个的情况,因为我正在从数据库中穿梭数据,其中dataframe索引映射到主键/唯一键,但对我来说实际上只是另一个“列”。

listHeaders=[my_dataframe中的colName]

最简单的方法是:list(my_dataframe.columns)my_dataframe.columns.tolist()

不需要上面复杂的东西:)

import pandas as pd
# create test dataframedf = pd.DataFrame('x', columns=['A', 'B', 'C'], index=range(2))
list(df.columns)

退货

['A', 'B', 'C']

这是实现目标的最简单方法。

my_dataframe.columns.values.tolist()

如果你是懒惰的,试试这个。

列表(my_dataframe)

这是给你的简单代码:

for i in my_dataframe:print(i)

照做就是了

它非常简单。

就像你可以这样做:

列表(df.columns)