从pandas DataFrame列标题中获取列表

时间:2013-10-20 21:18:38

标签: python pandas dataframe

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

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

>>> header_list
[y, gdp, cap]

20 个答案:

答案 0 :(得分:1378)

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

list(my_dataframe.columns.values)

您也可以使用:(如Ed Chum's answer所示):

list(my_dataframe)

答案 1 :(得分:332)

有一种内置方法,效率最高:

my_dataframe.columns.values.tolist()

.columns返回一个索引,.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)

对于那些讨厌打字的人,您只需拨打list上的df即可:

list(df)

答案 2 :(得分:78)

进行了一些快速测试,也许毫不奇怪,使用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!)

答案 3 :(得分:43)

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

df.columns.tolist()

会在一个很好的列表中为你提供列名。

答案 4 :(得分:32)

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

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

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

顺便说一下,您只需使用sorted

即可获得排序列表
>>> sorted(my_dataframe)
['cap', 'gdp', 'y']

答案 5 :(得分:23)

可以my_dataframe.columns

答案 6 :(得分:18)

这很有意思但是df.columns.values.tolist()几乎是df.columns.tolist()的3倍,但我认为它们是相同的:

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

答案 7 :(得分:15)

DataFrame遵循类似于dict的惯例,迭代对象的“键”。

my_dataframe.keys()

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

my_dataframe.keys().to_list()
list(my_dataframe.keys())
DataFrame上的

Basic iteration会返回列标签

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

答案 8 :(得分:12)

在笔记本中

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

sorted(df)

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

在代码库

在代码中我发现它更明确

df.columns

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

答案 9 :(得分:8)

很奇怪,到目前为止我还没有看到这则消息,所以我就把它留在这里。

扩展的可重复拆包(python3.5 +):[*df]和朋友

Unpacking generalizations (PEP 448)已在Python 3.5中引入。因此,以下所有操作都是可能的。

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's answer,但已更新为   v0.24,其中.to_numpy()优于.values的使用。看到   this answer(由我)   有关更多信息。

外观检查
既然我已经在其他答案中看到过讨论的内容,则可以使用可迭代的拆包(无需显式循环)。

print(*df)
A B C

print(*df, sep='\n')
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))仅应用作上述方法的简洁替代方法。

答案 10 :(得分:3)

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

答案 11 :(得分:3)

正如Simeon Visser所回答的......你可以做到

list(my_dataframe.columns.values) 

list(my_dataframe) # for less typing.

但我认为最大的好处是:

list(my_dataframe.columns)

这是明确的,同时也没有多长时间。

答案 12 :(得分:3)

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

for col in df.columns:
    print col

答案 13 :(得分:3)

这为我们提供了列表中各列的名称:

filter {
  mutate {
      add_field => { "[@metadata][indexname]", "tags[0]" }
  }
}
output {
   elasticsearch {
         hosts => ["elkserver:9200"]
         user => user
         password => password
         ssl => true
         ssl_certificate_verification => true
         cacert => "/etc/logstash/master.pem"
         index => "%{[@metadata][indexname]}"
   }
}

也可以使用另一个名为tolist()的函数:

list(my_dataframe.columns)

答案 14 :(得分:2)

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

正如@fixxxer所说,答案取决于您在项目中使用的pandas版本。 使用pd.__version__命令可以获得哪些内容。

如果你出于某种原因像我一样(在debian jessie上使用0.14.1)使用比0.16.0更旧的熊猫版本,那么你需要使用:

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

这种密钥方法的优点是,它甚至可以在较新版本的熊猫中使用,因此它更具普遍性。

答案 15 :(得分:1)

即使上面提供的解决方案很好。我也希望像frame.column_names()这样的东西在熊猫中是一个函数,但是由于不是,所以使用以下语法可能会很好。通过调用“ tolist”函数,它以某种方式保留了您以正确方式使用熊猫的感觉:frame.columns.tolist()

frame.columns.tolist() 

答案 16 :(得分:1)

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

答案 17 :(得分:0)

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

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

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

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

答案 18 :(得分:0)

list(df.columns)

这将为您提供数据框df的列名列表。

答案 19 :(得分:-1)

此解决方案列出了对象my_dataframe的所有列:

print(list(my_dataframe))