パンダ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)
また、あなたは単に使用することができます:
list(my_dataframe)
最もパフォーマンスの高い組み込みメソッドがあります。
my_dataframe.columns.values.tolist()
.columns
はIndex
を返し、.columns.values
はarray
を返し、これには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に感謝します!)
それはさらに簡単になります(パンダ0.16.0)
df.columns.tolist()
niceリストのカラム名を教えてくれます。
>>> list(my_dataframe)
['y', 'gdp', 'cap']
デバッガモードでデータフレームの列を一覧表示するには、リスト内包表記を使用します。
>>> [c for c in my_dataframe]
['y', 'gdp', 'cap']
ちなみに、sorted
を使うだけでソート済みリストを得ることができます。
>>> sorted(my_dataframe)
['cap', 'gdp', 'y']
それはmy_dataframe.columns
として利用可能です。
面白いですが、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
DataFrame は、オブジェクトの「キー」を反復処理するという辞書形式の規則に従います。
my_dataframe.keys()
キー/カラムのリストを作る - オブジェクトメソッドto_list()
とPythonic way
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)
IPythonノートブックでのデータ探索のために、私が好む方法はこれです:
sorted(df)
これは読みやすいアルファベット順のリストを生成します。
コードでは、実行するほうがより明示的です。
df.columns
それは他の人があなたがしていることをあなたのコードを読んでいることに伝えるからです。
驚いたことに、これまでにこの投稿を見たことがないので、ここに置いておきます。
[*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
nameが必要な場合は__....
[*df]
# ['A', 'B', 'C']
set
name__が欲しい場合は、
{*df}
# {'A', 'B', 'C'}
Tuple
name__が欲しい場合は、
*df, # Please note the trailing comma
# ('A', 'B', 'C')
あるいは、結果をどこかに保存したい場合は、
*cols, = df # A wild comma appears, again
cols
# ['A', 'B', 'C']
...あなたがコーヒーをタイピング音に変換するような人なら、これはあなたのコーヒーをより効率的に消費することになります;)
P。。パフォーマンスが重要な場合は、上記の解決策を捨ててください。
df.columns.to_numpy().tolist() # ['A', 'B', 'C']
これは Ed Chum's answer に似ていますが、
.to_numpy()
が.values
の使用よりも優先されるv0.24用に更新されています。詳細については、 この回答 (私による)を参照してください。
目視チェック
これについては他の答えで説明したので、繰り返し可能な解凍を利用できます(明示的なループは不要です)。
print(*df)
A B C
print(*df, sep='\n')
A
B
C
単一行で実行できる操作には明示的なfor
name__ループを使用しないでください(リスト内包表記は問題ありません)。
次に、sorted(df)
を使用しても、列の元の順序 は保持されません。そのためには、代わりにlist(df)
を使うべきです。
次に、list(df.columns)
とlist(df.columns.values)
は悪い提案です(現在のバージョン、v0.24現在)。 Index
name__(df.columns
から返される)とNumPy配列(df.columns.values
によって返される)の両方とも、より速くより慣用的な.tolist()
メソッドを定義します。
最後に、説明、すなわちlist(df)
は前述の方法の簡潔な代替としてのみ使用されるべきです。
simeon Visserが回答したとおり...
list(my_dataframe.columns.values)
または
list(my_dataframe) # for less typing.
しかし、私はほとんどのスイートスポットは次のように考えています。
list(my_dataframe.columns)
それは明白であり、同時に不必要に長くはありません。
これにより、リスト内の列の名前がわかります。
list(my_dataframe.columns)
Tolist()という別の関数も使用できます。
my_dataframe.columns.tolist()
迅速で、きちんとした、視覚的なチェックのために、これを試してください:
for col in df.columns:
print col
n = []
for i in my_dataframe.columns:
n.append(i)
print n
私は質問がさらなる説明に値すると感じます。
@fixxxerが述べたように、答えはあなたがあなたのプロジェクトで使用しているパンダバージョンに依存します。どれがpd.__version__
コマンドで得られます。
私のような何らかの理由で(私は0.14.1を使っているDebian jessieでは)0.16.0より古いバージョンのパンダを使っているのであれば、それを使う必要があります:
まだ実装されているdf.columns
メソッドがないため、df.keys().tolist()
。
このキー方式の利点は、パンダの新しいバージョンでも機能するということです。
%%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)
上で提供された解決策はいいですが。また、私はframe.column_names()のようなものがパンダの中の関数であると期待するでしょう、しかしそうではないので、多分それは以下の構文を使うのはいいでしょう。それはどういうわけかあなたが "tolist"関数を呼び出すことによってあなたが適切な方法でパンダを使っているという感覚を保存します:frame.columns.tolist()
frame.columns.tolist()
このソリューションは、オブジェクトmy_dataframeのすべての列をリストします。
print(list(my_dataframe))