我想从 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']
有一个内置方法是性能最高的:
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)
对于那些讨厌打字的人,你可以打电话list
上df
,这样:
list(df)
我做了一些快速测试,也许不出所料,内置版本使用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!)
扩展的可迭代解包(Python 3.5+):[*df]
和朋友
解包概括 (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']
…如果您是将咖啡转换为打字声音的那种人,那么这将更有效地消耗您的咖啡;)
PS:如果性能很重要,您将需要放弃上述解决方案以支持
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
循环一个可以在一行中完成的操作(列表推导没关系)。
接下来,使用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 或更早版本的上述方法的简洁替代方法,其中扩展解包不可用。
>>> list(my_dataframe)
['y', 'gdp', 'cap']
要在调试器模式下列出数据框的列,请使用列表推导:
>>> [c for c in my_dataframe]
['y', 'gdp', 'cap']
顺便说一句,您只需使用即可获得排序列表sorted
:
>>> sorted(my_dataframe)
['cap', 'gdp', 'y']