我想从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]
答案 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)
很奇怪,到目前为止我还没有看到这则消息,所以我就把它留在这里。
[*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)
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))