关于python:从pandas数据帧列标题获取列表

Get list from pandas DataFrame column headers

我想从熊猫数据帧中获取列标题的列表。数据帧将来自用户输入,因此我不知道将有多少列,或者将如何调用它们。

例如,如果给我这样的数据帧:

1
2
3
4
5
6
7
8
9
10
11
12
>>> 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

我想得到如下列表:

1
2
>>> header_list
[y, gdp, cap]


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

1
list(my_dataframe.columns.values)

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

1
list(my_dataframe)


有一种内置方法是最有效的:

1
my_dataframe.columns.values.tolist()

.columns返回一个索引,.columns.values返回一个数组,它有一个助手函数.tolist返回一个列表。

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

1
my_dataframe.columns.tolist()

性能差异明显:

1
2
3
4
5
%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,这样:

1
list(df)


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

1
2
3
4
5
6
7
8
9
10
11
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!)


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

1
df.columns.tolist()

将在一个好的列表中为您提供列名称。


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

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

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

另外,只需使用sorted就可以得到一个排序列表:

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


这是以my_dataframe.columns的形式提供的。


有趣的是,df.columns.values.tolist()df.columns.tolist()快了近3倍,但我认为它们是一样的:

1
2
3
4
5
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


数据帧遵循类似dict的约定,迭代对象的"键"。

1
my_dataframe.keys()

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

1
2
my_dataframe.keys().to_list()
list(my_dataframe.keys())

数据帧上的基本迭代返回列标签

1
[column for column in my_dataframe]

不要将数据帧转换为列表,只需要获取列标签。在寻找方便的代码示例时不要停止思考。

1
2
3
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)


在笔记本上

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

1
sorted(df)

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

在代码存储库中

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

1
df.columns

因为它告诉别人你在读你的代码。


正如西蒙·维瑟的回答……你可以的。

1
list(my_dataframe.columns.values)

1
list(my_dataframe) # for less typing.

但我认为最美妙的地方是:

1
list(my_dataframe.columns)

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


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

1
list(my_dataframe.columns)

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

1
my_dataframe.columns.tolist()


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

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

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

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

这种键方法的优点是,它甚至在更新版本的熊猫中也能工作,所以它更通用。


要快速、整洁、目视检查,请尝试以下操作:

1
2
for col in df.columns:
    print col

1
2
3
4
n = []
for i in my_dataframe.columns:
    n.append(i)
print n


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

扩展的Iterable解包(python3.5+):[*df]和朋友

python 3.5引入了解包通用化(pep 448)。因此,以下操作都是可能的。

1
2
3
4
5
6
7
8
9
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

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

或者,如果你想要一个set

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

或者,如果你想要一个tuple

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

或者,如果你想把结果存储在某个地方,

1
2
3
*cols, = df  # A wild comma appears, again
cols
# ['A', 'B', 'C']

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

P.S.: if performance is important, you will want to ditch the
solutions above in favour of

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

This is similar to Ed Chum's
answer, but updated for
v0.24 where .to_numpy() is preferred to the use of .values. See
this answer (by me)
for more information.

目视检查因为我已经在其他答案中看到了这一点,所以您可以使用ITerable解包(不需要显式循环)。

1
2
3
4
5
6
7
8
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)只能用作上述方法的简明替代方法。


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


此解决方案列出对象"我的数据框"的所有列:

1
print(list(my_dataframe))


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

1
frame.columns.tolist()