Answers:
您可以通过执行以下操作以列表形式获取值:
list(my_dataframe.columns.values)
您也可以简单地使用:(如Ed Chum的答案所示):
list(my_dataframe)
df.column_names()
。这个答案是正确的还是过时的?
有一个内置的方法是最有效的:
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)
DataFrame
自第一天起,@SaschaGottfried迭代器的实现就没有改变:pandas.pydata.org/pandas-docs/stable/basics.html#iteration。从DataFrame返回的可迭代对象始终是列,因此for col in df:
除非开发人员崩溃,list(df)
而且这样做仍然应该是有效的方法,否则这样做的行为应始终相同。请注意,df.keys()
正在调用类似dict的结构的内部实现,并返回作为列的键。莫名其妙的
columns
属性的实现细节。一个小时前,我读到有关Demeter的定律,该定律提倡调用者不应该依赖于内部对象模型的导航。 list(df)
进行显式类型转换。显着的副作用:执行时间和内存消耗随数据帧大小的增加而增加, df.keys()
这是a的dict-like性质的一部分DataFrame
。值得注意的事实:df.keys()
无论数据框大小如何,其执行时间都相当恒定-这是熊猫开发人员的责任之一。
做了一些快速测试,使用内置版本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!)
很奇怪,到目前为止我还没有看到这个帖子,所以我就把它留在这里。
[*df]
和FriendsPython 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进行了更新,而v0.24
.to_numpy()
则首选使用.values
。有关更多信息,请参阅 此答案(我本人)。
视觉检查
由于我已经在其他答案中看到了这一点,因此可以使用可迭代的拆包(无需显式循环)。
print(*df)
A B C
print(*df, sep='\n')
A
B
C
不要for
对可以在一行中完成的操作使用显式循环(列表理解是可以的)。
接下来,using 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方法的简明替代方法,其中python <= 3.4无法扩展扩展。
可以作为my_dataframe.columns
。
header_list = list(my_dataframe.columns)
df.columns.tolist()
。
这很有趣,但是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
一个数据帧遵循类似字典的遍历对象的“钥匙”的约定。
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)
df.columns
速度比快得多df.keys()
。不确定为什么它们同时具有相同的功能和属性(嗯,这不是我第一次看到10种不同的方法来对熊猫做某事)。
%%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)
正如Simeon Visser回答的那样...您可以
list(my_dataframe.columns.values)
要么
list(my_dataframe) # for less typing.
但是我认为最甜蜜的地方是:
list(my_dataframe.columns)
很明显,与此同时不必太长。
list
除非df
直接调用(例如,简洁),否则调用没有任何优点。访问该.columns
属性将返回一个Index
对象,该对象上具有tolist()
定义的方法,并且调用该对象比列出该对象更惯用Index
。仅出于完整性考虑而混合使用成语并不是一个好主意。列出从中得到的数组也一样.values
。
我觉得问题值得进一步解释。
正如@fixxxer指出的,答案取决于您在项目中使用的熊猫版本。您可以通过pd.__version__
命令获得。
如果您出于某种原因(在我的Debian jessie上使用0.14.1)使用了比0.16.0更旧的熊猫,那么您需要使用:
df.keys().tolist()
因为还没有df.columns
实现任何方法。
这种密钥方法的优点是,即使在较新版本的熊猫中也可以使用,因此更加通用。
n = []
for i in my_dataframe.columns:
n.append(i)
print n
[n for n in dataframe.columns]
即使上面提供的解决方案很好。我也希望像frame.column_names()这样的东西在熊猫中是一个函数,但是由于不是,所以使用以下语法可能会很好。通过调用“ tolist”函数,它以某种方式保留了您以正确方式使用熊猫的感觉:frame.columns.tolist()
frame.columns.tolist()
columns
属性?