パンダシリーズまたはインデックスをNumpy配列に変換するにはどうすればよいですか?


264

DataFrameのインデックスまたは列をNumPy配列またはPythonリストとして取得する方法を知っていますか?



これはあなたの質問に答えますか?パンダデータフレームをNumPy配列に変換
AMC

1
注: Pandas DataFrameをこのような配列(またはリスト)に変換する必要がある場合は、他の問題を示している可能性があります。私は強くDATAFRAMEがあなたの特定のユースケースに適したデータ構造であることを確実にすることをお勧めします、とパンダはあなたに興味を持っている操作を実行する任意の方法が含まれていないこと。
AMC

回答:


353

NumPy配列を取得するには、次のvalues属性を使用する必要があります。

In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=['a', 'b', 'c']); df
   A  B
a  1  4
b  2  5
c  3  6

In [2]: df.index.values
Out[2]: array(['a', 'b', 'c'], dtype=object)

これは、データが既に格納されている方法にアクセスするため、変換の必要はありません。
注:この属性は、他の多くのパンダのオブジェクトでも使用できます。

In [3]: df['A'].values
Out[3]: Out[16]: array([1, 2, 3])

インデックスをリストとして取得するには、次を呼び出しますtolist

In [4]: df.index.tolist()
Out[4]: ['a', 'b', 'c']

同様に、列についても同様です。


注:.valuesは非推奨で.to_numpy()あり、NumPy配列が必要な場合に推奨される置き換えです。これを拡張して、データがすでに格納されている方法にアクセスできるので、変換の必要はありませんか?
AMC

cs95答え.values.to_numpy()とのすばらしい説明です.array
AMC

75

を使用df.indexしてインデックスオブジェクトにアクセスし、を使用してリストの値を取得できますdf.index.tolist()。同様に、df['col'].tolist()シリーズに使用できます。



12
@VShreyas、いかがですかdf.index.values.tolist()
LancelotHolmes

3
df.index.tolist()インスタンスメソッドを返しません。インデックスのリストを返します。それはパンダのインデックスで定義されたメソッドです。最初に値を呼び出すことは可能ですが、ジョブをnumpyに委任することは修正ではなく、単なる代替手段です。
ayhan

51

パンダ> = 0.24

.valuesこれらの方法を支持しての使用を非推奨にしてください!

以降v0.24.0から、我々は2ブランド真新しい、優先からnumpyのアレイを得るための方法がありますIndexSeriesと、DataFrameオブジェクトを:彼らはto_numpy()、と.array。使用法に関して、ドキュメントは次のように述べています:

削除または非推奨のSeries.valuesor DataFrame.valuesはありませんが代わりにまたは を使用することを強くお勧めします。.array.to_numpy()

詳細については、v0.24.0リリースノートのこのセクションを参照してください。


to_numpy() 方法

df.index.to_numpy()
# array(['a', 'b'], dtype=object)

df['A'].to_numpy()
#  array([1, 4])

デフォルトでは、ビューが返されます。変更を加えると元のファイルに影響します。

v = df.index.to_numpy()
v[0] = -1

df
    A  B
-1  1  2
b   4  5

代わりにコピーが必要な場合は、to_numpy(copy=True);を使用してください。

v = df.index.to_numpy(copy=True)
v[-1] = -123

df
   A  B
a  1  2
b  4  5

この関数はDataFrameでも機能することに注意してください(機能し.arrayません)。


array属性
この属性はExtensionArray、インデックス/シリーズを支持するオブジェクトを返します。

pd.__version__
# '0.24.0rc1'

# Setup.
df = pd.DataFrame([[1, 2], [4, 5]], columns=['A', 'B'], index=['a', 'b'])
df

   A  B
a  1  2
b  4  5

df.index.array    
# <PandasArray>
# ['a', 'b']
# Length: 2, dtype: object

df['A'].array
# <PandasArray>
# [1, 4]
# Length: 2, dtype: int64

ここから、以下を使用してリストを取得できますlist

list(df.index.array)
# ['a', 'b']

list(df['A'].array)
# [1, 4]

または、直接呼び出すだけ.tolist()です:

df.index.tolist()
# ['a', 'b']

df['A'].tolist()
# [1, 4]

返されるものに関して、ドキュメントは言及し、

通常のNumPy配列によってサポートされているためSeriesIndexはの周りの薄い(コピーなしの)ラッパーでSeries.array ある新しいを返します。それ自体は特に有用ではありませんが、パンダで、またはサードパーティのライブラリで定義されている拡張配列と同じインターフェイスを提供します。arrays.PandasArraynumpy.ndarrayarrays.PandasArray

要約すると、.arrayどちらかが返されます

  1. 既存ExtensionArrayのインデックス/シリーズの裏付け、または
  2. シリーズを支えるNumPy配列がある場合、新しいExtensionArrayオブジェクトは、基になる配列の薄いラッパーとして作成されます。


2つの新しいメソッドを追加する根拠これらの関数は、2つのGitHub問題GH19954およびGH23623での議論の結果として追加されました。

具体的には、ドキュメントは根拠に言及しています:

[...] .values戻り値が実際の配列、それの何らかの変換、またはpandasカスタム配列(などCategorical)のいずれであるかは明確ではありませんでした。たとえば、を 使用するとPeriodIndex、毎回.values新しいndarray期間オブジェクトが生成されます。[...]

これら2つの関数は、正しい方向への主要なステップであるAPIの一貫性を向上させることを目的としています。

最後.valuesに、現在のバージョンでは非推奨になりませんが、これは将来のいずれかの時点で発生する可能性があるため、できるだけ早く新しいAPIに移行することをユーザーにお願いします。


48

マルチインデックスデータフレームを扱っている場合は、マルチインデックスの1つの名前の列のみを抽出する必要がある場合があります。あなたはこれを次のように行うことができます

df.index.get_level_values('name_sub_index')

そしてもちろんname_sub_index、の要素でなければなりませんFrozenList df.index.names


16

パンダv0.13以降、次も使用できますget_values

df.index.get_values()

5
これと.valuesの間に違いはありますか?(この機能は0.13.0ドキュメントから表示されるため、バージョン情報を更新しました。)
Andy Hayden

@Andy Hayden:.get_valuesが現在の値のみを取得する公式の方法ですが、.values(マルチインデックスなど)は行または列が削除されたインデックス値を返す可能性があるという違いはありませんか?
Ezekiel Kruglick、2015年

@EzekielKruglickなので、常にコピーですか?ドキュメンテーションへのリンクは非常に軽く、私はあなたがそのような偽物を手に入れるとは思いませんでした(たとえそれらがMIに含まれていても、.valuesには含まれません)これを実証する例を見るのは素晴らしいでしょう!
アンディヘイデン

@AndyHayden:私はあなたのコメントを間違って読んだと思います。そうです、.valuesは適切で、.levelは古く、get_valuesはドロップされた行/列を除いて現在の値を適切に提供します。元のgithubの問題:github.com/pydata/pandas/issues/3686しかし、チェックしたところ、.values(もちろん!)が最新の情報を、私たちが話していたものとは異なる形式でしか提供していないようです
エゼキエル・クラッグリック

1
@AndyHaydenいいえ、違いはありません。get_values呼び出すだけ.values。入力する文字が多いです。
cs95

0

私はパンダdataframeをに変換しlist、基本を使用しましたlist.index()。このようなもの:

dd = list(zone[0]) #Where zone[0] is some specific column of the table
idx = dd.index(filename[i])

あなたはあなたとして値をインデックス化していますidx


次に、基本的なlist.index()を使用しました。これは、シリーズをリストに変換する問題にどのように関連していますか
AMC

0

これを行う最近の方法は、.to_numpy()関数を使用することです。

「price」列のデータフレームがある場合、次のように変換できます。

priceArray = df['price'].to_numpy()

floatやオブジェクトなどのデータ型を関数の引数として渡すこともできます


-1

以下は、データフレーム列をnumpy配列に変換する簡単な方法です。

df = pd.DataFrame(somedict) 
ytrain = df['label']
ytrain_numpy = np.array([x for x in ytrain['label']])

ytrain_numpyはnumpy配列です。

試してみましたto.numpy()が、次のエラーが発生しました: TypeError:タイプのサポートされている変換はありません:(dtype( 'O')、)線形SVCを使用してバイナリ関連性分類を行っています。to.numpy()はdataFrameをnumpy配列に変換していましたが、上記のエラーが発生したため、内部要素のデータ型がリストでした。


to.numpy()を試してみましたが、次のエラーが発生しました:TypeError:タイプのサポートされている変換はありません:(dtype( 'O')、)線形SVCを使用してバイナリ関連性分類を行っています。to.numpy()はdataFrameをnumpy配列に変換していましたが、上記のエラーが発生したため、内部要素のデータ型がリストでした。しかし、それは実際にはのせいでto_numpyはありません。
AMC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.