问答中心分类: DATABASE从 Pandas DataFrame 列标题中获取列表
0
匿名用户 提问 28分钟 前

我想从 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']
22 Answers
0
EdChum 回答 28分钟 前

有一个内置方法是性能最高的:

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)

对于那些讨厌打字的人,你可以打电话listdf,这样:

list(df)
0
tegan 回答 28分钟 前

我做了一些快速测试,也许不出所料,内置版本使用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!)

0
fixxxer 回答 28分钟 前

它变得更加简单(通过 Pandas 0.16.0):

df.columns.tolist()

会给你一个很好的列表中的列名。

0
cs95 回答 28分钟 前

扩展的可迭代解包(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 或更早版本的上述方法的简洁替代方法,其中扩展解包不可用。

0
Alexander 回答 28分钟 前
>>> list(my_dataframe)
['y', 'gdp', 'cap']

要在调试器模式下列出数据框的列,请使用列表推导:

>>> [c for c in my_dataframe]
['y', 'gdp', 'cap']

顺便说一句,您只需使用即可获得排序列表sorted

>>> sorted(my_dataframe)
['cap', 'gdp', 'y']