从 Pandas DataFrame 列标题中获取列表

2025-02-05 13:24:00
admin
原创
86
摘要:问题描述:我想从 Pandas DataFrame 中获取列标题列表。DataFrame 将来自用户输入,因此我不知道有多少列或它们将被称为什么。例如,如果我得到一个这样的 DataFrame: y gdp cap 0 1 2 5 1 2 3 9 2 8 7...

问题描述:

我想从 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']

解决方案 1:

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

list(my_dataframe.columns.values)

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

list(my_dataframe)

解决方案 2:

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

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)

解决方案 3:

我做了一些快速测试,也许并不奇怪,使用的内置版本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!)

解决方案 4:

扩展的可迭代解包 (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']

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

PS:如果性能很重要,你会想要放弃上面的解决方案,转而采用

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

这与Ed Chum 的回答类似,但已针对 v0.24 进行了更新,其中.to_numpy()优先使用.values
有关更多信息,请参阅此回答(由我提供)。

目视检查

由于我已在其他答案中看到过对此的讨论,因此您可以使用可迭代解包(不需要显式循环)。

print(*df)
A B C

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

对其他方法的批评

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

其次,使用sorted(df) 不会保留列的原始顺序。因此,您应该改用list(df)

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

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

解决方案 5:

它变得更加简单(到 Pandas 0.16.0):

df.columns.tolist()

将在一个漂亮的列表中为您提供列名。

解决方案 6:

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

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

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

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

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

解决方案 7:

其可用作my_dataframe.columns

解决方案 8:

这很有趣,但是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

解决方案 9:

DataFrame遵循类似字典的约定,对对象的“键”进行迭代。

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)

解决方案 10:

在笔记本中

对于IPython笔记本中的数据探索,我喜欢的方式是这样的:

sorted(df)

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

在代码存储库中

在代码中我发现更明确的做法是

df.columns

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

解决方案 11:

%%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)

解决方案 12:

它非常简单。

就像你可以这样做:

列表(df.列)

解决方案 13:

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

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

解决方案 14:

为了进行快速、整洁的视觉检查,请尝试以下操作:

for col in df.columns:
    print col

解决方案 15:

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

list(my_dataframe.columns.values)

或者

list(my_dataframe) # For less typing.

但我认为最理想的情况是:

list(my_dataframe.columns)

它很明确,同时又不会太长。

解决方案 16:

import pandas as pd

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

list(df.columns)

返回

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

解决方案 17:

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

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

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

df.keys().tolist()因为尚未df.columns实施任何方法。

这种键方法的优点是它即使在较新版本的 Pandas 中也能起作用,因此更加通用。

解决方案 18:

如果你使用 Pandas,那么使用以下命令

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

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

解决方案 19:

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

解决方案 20:

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

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

它避免调用 reset_index(),因为对于这样一个简单的操作来说,这会造成不必要的性能损失。

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

解决方案 21:

这是达到目标最简单的方法。

my_dataframe.columns.values.tolist()

如果你很懒,试试这个>

列表(我的数据框)

解决方案 22:

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

一些常见任务:

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()

解决方案 23:

这是适合您的简单代码:

for i in my_dataframe:
    print(i)

去做就对了

解决方案 24:

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

frame.columns.tolist()

解决方案 25:

listHeaders = [my_dataframe 中 colName 的 colName]

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用