我想从一个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']
你可以通过以下方式获得列表中的数值。
list(my_dataframe.columns.values)
也可以简单地使用:(如Ed Chum's answer中所示)。
list(my_dataframe)
有一种内置的方法是最能表现的。
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)
对于那些讨厌打字的人,你可以直接在df
上调用list
,如是。
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!)
有趣的是,"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
很惊讶我至今没有看到这个帖子,所以我就把这个留在这里。
[*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
<!- >
如果你想要一个列表
......。
[*df]
# ['A', 'B', 'C']
或者,如果你想要一个套
。
{*df}
# {'A', 'B', 'C'}
或者,如果你想要一个ttuple
。
*df, # Please note the trailing comma
# ('A', 'B', 'C')
或者,如果你想把结果存储在某个地方。
*cols, = df # A wild comma appears, again
cols
# ['A', 'B', 'C']
... 如果你'是那种将咖啡转换为打字声音的人,那么,这将更有效地消耗你的咖啡;)
>.P.S.: 如果你是那种把咖啡转换成打字声音的人,那么,这将会更有效地消耗你的咖啡;) P.S: 如果性能很重要的话,你会想要抛弃这个。
以上解决方案,以支持
&gt.to_numpy().tolist() df.columns.to_numpy().tolist() >.##39;A', 'B', 'C']
['A', 'B', 'C']
['A' 'B', 'C']
['A' 'B', 'C'] > >
。 这类似于[艾德-查姆'的 >.答案](),但更新了。 的回答](https://stackoverflow.com/a/19483602/4909087),但更新为
v0.24 其中
.to_numpy()
比使用.values
更可取。 参见本回答(由我)
更多信息。
目测检查 因为我在其他答案中看到过这个问题的讨论,你可以利用可迭代解包(不需要显式循环)。
print(*df)
A B C
print(*df, sep='\n')
A
B
C
不要对可以在一行中完成的操作使用显式的for
循环(List理解也可以)。
其次,使用sorted(df)
不会保留列的原始顺序。
为此,你应该使用list(df)
来代替。
其次,list(df.columns)
和list(df.columns.values)
都是很差的建议(在当前版本,v0.24)。
Index
(由df.columns
返回)和NumPy数组(由df.columns.values
返回)都定义了.tolist()
方法,它更快,更习惯。
最后,listification,即list(df)
只能作为上述方法的简明替代方法。
一个[DataFrame][1]遵循类似于dict的约定,对对象的 "键 "进行迭代。
my_dataframe.keys()
创建键/列列表--对象方法 "to_list() "和pythonic方式。
my_dataframe.keys().to_list()
list(my_dataframe.keys())
在DataFrame上的[基本迭代][2]返回列标签。
[column for column in my_dataframe]
不要为了得到列标签而将DataFrame转换为列表。 不要一边寻找方便的代码样本,一边停止思考。
<!--语言。 python -->
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)
[1]: https://pandas.pydata.org/pandas-docs/stable/api.html#dataframe [2]: http://pandas.pydata.org/pandas-docs/stable/basics.html#iteration
%%时间
final_df.columns.value.tolist()
948 ns ±
每循环19.2 ns(平均值±。
std.
dev.
7次运行,每次1000000个循环的平均值)
%%时间
列表(final_df.columns)
14.2 µs ±
79.1 ns/循环(平均值±
std.
dev.
的7次运行,每次100000个循环)
%%时间
list(final_df.columns.value)
1.88 µs ±
11.7 ns/循环(平均值±
std.
dev.
7次运行,每次1000000个循环)
%%时间
final_df.columns.tolist()
12.3 µs ±
27.4 ns/循环(平均值±
std.
dev.
的7次运行,每次100000个循环)
%%时间
list(final_df.head(1).columns)
163 µs ±
20.6 µs/循环(平均值±
std.
dev.
7次运行,每次10000次循环)
尽管上面提供的解决方案很好,但我还是希望像frame.column_names()这样的东西在pandas中是一个函数。 我也希望像frame.column_names()这样的东西在pandas中是一个函数,但是既然它不是,也许使用下面的语法会更好。 通过调用 "tolist",它在某种程度上保留了你以正确方式使用 pandas 的感觉。 函数,从而保留了你使用 pandas 的正确方式。 frame.columns.tolist()
frame.columns.tolist()