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

当前回答

为了快速,简洁,直观的检查,试试这个:

for col in df.columns:
    print col

其他回答

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

扩展可迭代解包(Python 3.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

如果你想要一个列表....

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

或者,如果你想要一组,

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

如果你想要一个元组,

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

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

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

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

附注:如果性能很重要,你会想要抛弃 上述解决方案有利于 .tolist df.columns.to_numpy () () # [' a ', ' b ', ' c '] 这与Ed Chum的答案相似,但更新了 V0.24,其中.to_numpy()优先于.values的使用。看到 这个答案(由我)为更多的信息。

目视检查

因为我在其他回答中已经看到过这个问题,所以可以使用可迭代解包(不需要显式循环)。

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()方法,该方法更快,更习惯。

最后,对于Python 3.4或更早版本,在扩展解包不可用的情况下,应该只使用列表(list(df))作为上述方法的简洁替代。

为了快速,简洁,直观的检查,试试这个:

for col in df.columns:
    print col
import pandas as pd

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

list(df.columns)

返回

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

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

list(my_dataframe.columns.values)

or

list(my_dataframe) # For less typing.

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

list(my_dataframe.columns)

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