从pandas DataFrame列标题中获取列表

nat*_*002 914 python dataframe pandas

我想从pandas DataFrame中获取列标题列表.DataFrame将来自用户输入,因此我不知道将会有多少列或将调用它们.

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

>>> my_dataframe
    y  gdp  cap
0   1    2    5
1   2    3    9
2   8    7    2
3   3    4    7
4   6    7    7
5   4    8    3
6   8    2    8
7   9    9   10
8   6    6    4
9  10   10    7
Run Code Online (Sandbox Code Playgroud)

我想得到一个如下所示的列表:

>>> header_list
['y', 'gdp', 'cap']
Run Code Online (Sandbox Code Playgroud)

Sim*_*ser 1506

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

list(my_dataframe.columns.values)
Run Code Online (Sandbox Code Playgroud)

你也可以简单地使用:

list(my_dataframe)
Run Code Online (Sandbox Code Playgroud)

  • 为什么[this doc](http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.html)没有`columns`作为属性? (38认同)
  • 重要的是,这会保留列顺序. (16认同)
  • 我会期待像`df.column_names()`这样的东西.这个答案是对还是过时了? (4认同)

EdC*_*ica 371

有一种内置的方法,性能最高:

my_dataframe.columns.values.tolist()
Run Code Online (Sandbox Code Playgroud)

.columns返回一个.columns.values,.tolist返回一个,Index并且它有一个辅助函数来返回一个.tolist().

编辑

对于那些讨厌打字的人来说,这可能是最短的方法:

my_dataframe.columns.tolist()
Run Code Online (Sandbox Code Playgroud)

  • 没有投下反对票,而是要解释:不依赖于实现细节,使用DataFrame的“公共接口”。想想df.keys()的美丽 (3认同)

teg*_*gan 84

做了一些快速测试,也许不出所料,使用的内置版本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
Run Code Online (Sandbox Code Playgroud)

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


fix*_*xer 46

它变得更简单(通过熊猫0.16.0):

df.columns.tolist()
Run Code Online (Sandbox Code Playgroud)

将在一个很好的列表中给你列名称.


Ale*_*der 34

>>> list(my_dataframe)
['y', 'gdp', 'cap']
Run Code Online (Sandbox Code Playgroud)

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

>>> [c for c in my_dataframe]
['y', 'gdp', 'cap']
Run Code Online (Sandbox Code Playgroud)

顺便说一下,您只需使用sorted以下命令即可获得排序列表:

>>> sorted(my_dataframe)
['cap', 'gdp', 'y']
Run Code Online (Sandbox Code Playgroud)

  • 应该为所有人工作。但是,当您在调试器中时,需要使用列表理解`[c for df中的c]。 (2认同)

Bre*_*arn 24

这是可用的my_dataframe.columns.


Ant*_*pov 18

它很有趣,但df.columns.values.tolist()几乎快了3倍,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
Run Code Online (Sandbox Code Playgroud)

  • [这个答案](/sf/answers/1906572391/)中已经涵盖了时间。产生差异的原因是因为 `.values` 返回底层的 numpy 数组,并且用 numpy 做一些事情几乎总是比直接用 Pandas 做同样的事情快。 (2认同)

cs9*_*s95 18

很惊讶,到目前为止我还没有看到这个帖子,所以我就把它留在这里。

扩展的可迭代解压缩(python3.5 +):[*df]和Friends

Python 3.5引入了拆包概述(PEP 448)。因此,以下操作都是可能的。

df = pd.DataFrame('x', columns=['A', 'B', 'C'], index=range(5))
df

   A  B  C
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x 
Run Code Online (Sandbox Code Playgroud)

如果你想要一个list....

[*df]
# ['A', 'B', 'C']
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要一个set

{*df}
# {'A', 'B', 'C'}
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要一个tuple

*df,  # Please note the trailing comma
# ('A', 'B', 'C')
Run Code Online (Sandbox Code Playgroud)

或者,如果您要将结果存储在某处,

*cols, = df  # A wild comma appears, again
cols
# ['A', 'B', 'C']
Run Code Online (Sandbox Code Playgroud)

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

PS:如果性能很重要,那么您最好放弃上述解决方案,而选择

df.columns.to_numpy().tolist()
# ['A', 'B', 'C']
Run Code Online (Sandbox Code Playgroud)

这与Ed Chum的答案类似,但针对v0.24进行了更新,而v0.24 .to_numpy()则首选使用.values。有关更多信息,请参阅 此答案(由我本人)。

视觉检查
由于我已经在其他答案中看到了这一点,因此您可以利用可迭代的拆包(无需显式循环)。

print(*df)
A B C

print(*df, sep='\n')
A
B
C
Run Code Online (Sandbox Code Playgroud)

批判其他方法

不要for对可以在一行中完成的操作使用显式循环(列表理解是可以的)。

接下来,using sorted(df) 不会保留的原始顺序。为此,您应该list(df)改为使用。

接下来,list(df.columns)list(df.columns.values)差的建议(为当前版本,v0.24)。两者Index(从返回df.columns)和NumPy的阵列(由返回df.columns.values)限定.tolist()方法,该方法是更快和更惯用。

最后,列表化,即,list(df)仅应用作上述方法的简洁替代方案。


Sas*_*ied 16

一个数据帧如下迭代的在对象的"钥匙"的类似字典的约定.

my_dataframe.keys()
Run Code Online (Sandbox Code Playgroud)

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

my_dataframe.keys().to_list()
list(my_dataframe.keys())
Run Code Online (Sandbox Code Playgroud)

DataFrame上的基本迭代返回列标签

[column for column in my_dataframe]
Run Code Online (Sandbox Code Playgroud)

不要将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)
Run Code Online (Sandbox Code Playgroud)

  • 我的测试表明,“ df.columns”比“ df.keys()”要快得多。不确定为什么它们同时具有相同的功能和属性(嗯,这不是我第一次看到10种不同的方法来对熊猫做某事)。 (2认同)

fir*_*ynx 14

在笔记本中

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

sorted(df)
Run Code Online (Sandbox Code Playgroud)

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

在代码存储库中

在代码中我发现它更明确

df.columns
Run Code Online (Sandbox Code Playgroud)

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


小智 8

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


小智 7

非常简单。

就像你可以这样做:

列表(df.列)


小智 5

最简单的选择是: list(my_dataframe.columns)my_dataframe.columns.tolist()

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