从 Pandas DataFrame 列标题中获取列表

Get a list from Pandas DataFrame column headers

提问人:natsuki_2002 提问时间:10/21/2013 最后编辑:cottontailnatsuki_2002 更新时间:9/17/2023 访问量:2159536

问:

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

例如,如果我得到一个这样的 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

我会得到这样的列表:

['y', 'gdp', 'cap']
Python Pandas DataFrame 列表

评论


答:

26赞 BrenBarn 10/21/2013 #1

这可作为 .my_dataframe.columns

1994赞 Simeon Visser 10/21/2013 #2

您可以通过执行以下操作来获取列表形式的值:

list(my_dataframe.columns.values)

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

list(my_dataframe)
1赞 user21988 10/21/2013 #3
n = []
for i in my_dataframe.columns:
    n.append(i)
print n
513赞 EdChum 10/21/2013 #4

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

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)

对于那些讨厌打字的人,您可以拨打 ,如下所示:listdf

list(df)

评论

0赞 dzieciou 4/28/2023
最后一个选项非常惯用,它使我很难阅读代码......
19赞 Sascha Gottfried 1/24/2014 #5

DataFrame 遵循类似字典的约定,即遍历对象的“键”。

my_dataframe.keys()

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

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)
104赞 tegan 12/2/2014 #6

我做了一些快速测试,也许不出所料,内置版本使用的是最快的: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

(不过我还是很喜欢,所以谢谢 EdChumlist(dataframe)

61赞 fixxxer 4/7/2015 #7

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

df.columns.tolist()

将为您提供一个不错的列表中的列名。

41赞 Alexander 5/28/2015 #8
>>> list(my_dataframe)
['y', 'gdp', 'cap']

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

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

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

>>> sorted(my_dataframe)
['cap', 'gdp', 'y']
21赞 Anton Protopopov 12/5/2015 #9

这很有趣,但比 快了近三倍,但我认为它们是一样的: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

评论

2赞 cs95 4/3/2019
这个答案中已经涵盖了时间安排。造成差异的原因是因为返回底层的 numpy 数组,并且使用 numpy 做一些事情几乎总是比直接用 pandas 做同样的事情更快。.values
14赞 firelynx 3/30/2016 #10

在笔记本中

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

sorted(df)

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

在代码存储库中

在代码中,我发现它更明确

df.columns

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

2赞 StefanK 12/13/2017 #11

我觉得这个问题值得进一步解释。

正如 fixxxer 所指出的,答案取决于您在项目中使用的 Pandas 版本。你可以用命令得到。pd.__version__

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

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

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

3赞 Vivek Puurkayastha 2/17/2018 #12

正如 Simeon Visser 回答的那样,你可以做到

list(my_dataframe.columns.values)

list(my_dataframe) # For less typing.

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

list(my_dataframe.columns)

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

3赞 Joseph True 8/23/2018 #13

要进行快速、整洁、直观的检查,请尝试以下操作:

for col in df.columns:
    print col
-1赞 Igor Jakovljevic 2/14/2019 #14

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

frame.columns.tolist()
62赞 cs95 4/3/2019 #15

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

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

如果你想要一个....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, again
cols
# ['A', 'B', 'C']

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

P.S.:如果性能很重要,你会想要放弃 上述解决方案有利于

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

这与 Ed Chum 的答案类似,但针对 v0.24 其中首选于 .有关更多信息,请参阅此答案(由我提供)。.to_numpy().values

目视检查

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

print(*df)
A B C

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

对其他方法的批判

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

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

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

最后,列表化,即,对于无法进行扩展解包的 Python 3.4 或更早版本,应仅用作上述方法的简洁替代方案。list(df)

11赞 rohit singh 4/16/2019 #16
%%timeit
final_df.columns.values.tolist()
948 ns ± 19.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%%timeit
list(final_df.columns)
14.2 µs ± 79.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%%timeit
list(final_df.columns.values)
1.88 µs ± 11.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%%timeit
final_df.columns.tolist()
12.3 µs ± 27.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%%timeit
list(final_df.head(1).columns)
163 µs ± 20.6 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

评论

1赞 Peter Mortensen 10/22/2021
解释是有道理的。例如,总结和结论是什么?请通过编辑(更改)您的答案来回复,而不是在评论中(没有“编辑:”,“更新:”或类似内容 - 答案应该看起来好像是今天写的)。
1赞 totalhack 1/16/2020 #17

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

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

它避免了调用 reset_index(),因为对于这种简单的操作,这会对性能造成不必要的影响。

我经常需要这个,因为我正在从数据帧索引映射到主键/唯一键的数据库中穿梭数据,但实际上对我来说只是另一个“列”。对于熊猫来说,为这样的事情有一个内置的方法可能是有意义的(完全有可能我错过了它)。

-1赞 Spesh 10/28/2021 #18

listHeaders = [colName for colName in my_dataframe]

评论

0赞 Community 10/28/2021
您的答案可以通过其他支持信息进行改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。
5赞 Grégoire 1/19/2022 #19

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

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

3赞 gremur 4/2/2022 #20
import pandas as pd

# create test dataframe
df = pd.DataFrame('x', columns=['A', 'B', 'C'], index=range(2))

list(df.columns)

返回

['A', 'B', 'C']
1赞 Tusher 6/4/2022 #21

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

my_dataframe.columns.values.tolist()

如果你很懒惰,试试这个>

列表(my_dataframe)

0赞 Ilya 8/1/2022 #22

这是给你的简单代码:

for i in my_dataframe:
    print(i)

只管去做

7赞 Muhammad Imran Zaman 8/4/2022 #23

这很简单。

就像你可以这样做一样:

列表(df.columns)

评论

0赞 jtlz2 12/2/2022
这是一个新的答案吗?
0赞 cottontail 4/12/2023 #24

值得指出的是,几乎没有理由将列标题转换为列表。 将返回一个 Index/MultiIndex 对象,该对象可以像列表一样进行索引、切片和追加。事实上,由于它类似于 numpy 数组,因此您可以使用列表进行索引(您不能使用列表来执行此操作)。DataFrame.columns

一些常见任务:

df = pd.DataFrame({'A': range(5), 'B': range(6, 11), 'C': list('abcde')})

first_col_header = df.columns[0]                        # 1st column header
first_third_headers =  df.columns[[0,2]]                # 1st and 3rd column headers
df.columns = df.columns[:-1].append(pd.Index(['col5'])) # append a value
np.tile(df.columns, 2)      # == list(df)*2             # repeat headers
df.columns.repeat(2)        # == [c for c in df for _ in range(2)]

但是,如果您来这里是因为要将列中的值转换为列表,那么您的朋友:tolist()

lst = df['B'].tolist()
0赞 Amir Md Amiruzzaman 9/17/2023 #25

如果您使用的是 pandas,请使用以下命令

import pandas as pd
df = pd.read_csv(r'iris.csv')
#print(df.head(2))
# Dataframe show all columns
print(df.keys())

您可以启用注释以查看标题和 2 行数据。print(df.head(2))