Saya tertarik mengetahui cara mengubah kerangka data panda menjadi array NumPy.
bingkai data:
import numpy as np
import pandas as pd
index = [1, 2, 3, 4, 5, 6, 7]
a = [np.nan, np.nan, np.nan, 0.1, 0.1, 0.1, 0.1]
b = [0.2, np.nan, 0.2, 0.2, 0.2, np.nan, np.nan]
c = [np.nan, 0.5, 0.5, np.nan, 0.5, 0.5, np.nan]
df = pd.DataFrame({'A': a, 'B': b, 'C': c}, index=index)
df = df.rename_axis('ID')
memberi
label A B C
ID
1 NaN 0.2 NaN
2 NaN NaN 0.5
3 NaN 0.2 0.5
4 0.1 0.2 NaN
5 0.1 0.2 0.5
6 0.1 NaN 0.5
7 0.1 NaN NaN
Saya ingin mengonversikan ini menjadi array NumPy, seperti:
array([[ nan, 0.2, nan],
[ nan, nan, 0.5],
[ nan, 0.2, 0.5],
[ 0.1, 0.2, nan],
[ 0.1, 0.2, 0.5],
[ 0.1, nan, 0.5],
[ 0.1, nan, nan]])
Bagaimana saya bisa melakukan ini?
Sebagai bonus, mungkinkah untuk mempertahankan dtypes, seperti ini?
array([[ 1, nan, 0.2, nan],
[ 2, nan, nan, 0.5],
[ 3, nan, 0.2, 0.5],
[ 4, 0.1, 0.2, nan],
[ 5, 0.1, 0.2, 0.5],
[ 6, 0.1, nan, 0.5],
[ 7, 0.1, nan, nan]],
dtype=[('ID', '<i4'), ('A', '<f8'), ('B', '<f8'), ('B', '<f8')])
atau serupa?
Jawaban:
Untuk mengonversi panda dataframe (df) ke ndarray numpy, gunakan kode ini:
sumber
Hentikan penggunaan
values
danas_matrix()
!pandas v0.24.0 memperkenalkan dua metode baru untuk mendapatkan array NumPy dari objek panda:
to_numpy()
, yang didefinisikan padaIndex
,Series,
danDataFrame
objek, danarray
, yang didefinisikanIndex
danSeries
hanya objek.Jika Anda mengunjungi v0.24 docs for
.values
, Anda akan melihat peringatan merah besar yang mengatakan:Lihat bagian ini dari catatan rilis v0.24.0 , dan jawaban ini untuk informasi lebih lanjut.
Menuju Konsistensi Yang Lebih Baik:
to_numpy()
Dalam semangat konsistensi yang lebih baik di seluruh API, metode baru
to_numpy
telah diperkenalkan untuk mengekstrak array NumPy yang mendasarinya dari DataFrames.Seperti disebutkan di atas, metode ini juga didefinisikan
Index
danSeries
objek (lihat di sini ).Secara default, tampilan dikembalikan, sehingga setiap modifikasi yang dilakukan akan memengaruhi yang asli.
Jika Anda membutuhkan salinan, gunakan
to_numpy(copy=True
).panda> = 1.0 pembaruan untuk ExtensionTypes
Jika Anda menggunakan panda 1.x, kemungkinan Anda akan lebih sering berurusan dengan tipe ekstensi. Anda harus sedikit lebih berhati-hati agar jenis ekstensi ini dikonversi dengan benar.
Ini disebut dalam dokumen .
Jika Anda membutuhkan
dtypes
...Seperti yang ditunjukkan dalam jawaban lain,
DataFrame.to_records
adalah cara yang baik untuk melakukan ini.to_numpy
Sayangnya, ini tidak bisa dilakukan . Namun, sebagai alternatif, Anda dapat menggunakannp.rec.fromrecords
:Dari segi kinerja, hampir sama (sebenarnya, menggunakan
rec.fromrecords
sedikit lebih cepat).Dasar Pemikiran untuk Menambahkan Metode Baru
to_numpy()
(selainarray
) ditambahkan sebagai hasil dari diskusi di bawah dua masalah GitHub GH19954 dan GH23623 .Secara khusus, dokumen menyebutkan alasannya:
to_numpy
bertujuan untuk meningkatkan konsistensi API, yang merupakan langkah besar ke arah yang benar..values
tidak akan ditinggalkan dalam versi saat ini, tetapi saya berharap ini dapat terjadi di beberapa titik di masa depan, jadi saya akan mendorong pengguna untuk bermigrasi ke API yang lebih baru, secepat Anda bisa.Kritik atas Solusi Lain
DataFrame.values
memiliki perilaku yang tidak konsisten, sebagaimana telah dicatat.DataFrame.get_values()
hanyalah pembungkusDataFrame.values
, jadi semua yang dikatakan di atas berlaku.DataFrame.as_matrix()
sudah usang sekarang, JANGAN gunakan!sumber
as_matrix
ke solusi lain, dalam hal ini,to_numpy
tanpa menjelaskan bagaimana memulihkan fungsi pemilihan kolomas_matrix
! Saya yakin ada cara lain untuk memilih kolom, tetapias_matrix
setidaknya salah satunya!df[[col1, col2']].to_numpy()
? Tidak yakin mengapa Anda berpikir ingin mengiklankan alternatif yang diperbarui ke fungsi yang sudah tidak berlaku menjamin downvote pada jawabannya.Catatan :
.as_matrix()
Metode yang digunakan dalam jawaban ini sudah usang. Pandas 0.23.4 memperingatkan:Panda memiliki sesuatu yang dibangun di ...
memberi
sumber
object
.to_numpy
sebagai gantinya (bukan.values
keduanya). Lebih lanjut di sini .Saya hanya akan rantai fungsi DataFrame.reset_index () dan DataFrame.values untuk mendapatkan representasi Numpy dari dataframe, termasuk indeks:
Untuk mendapatkan dtypes, kita perlu mengubah ndarray ini menjadi array terstruktur menggunakan view :
sumber
Anda dapat menggunakan
to_records
metode ini, tetapi harus sedikit bermain-main dengan dtypes jika mereka tidak seperti yang Anda inginkan sejak awal. Dalam kasus saya, setelah menyalin DF Anda dari string, tipe indeks adalah string (diwakili olehobject
dtype dalam panda):Mengonversi tipe rekarray tidak berfungsi untuk saya, tetapi orang dapat melakukannya di Panda:
Perhatikan bahwa Pandas tidak menetapkan nama indeks dengan benar (ke
ID
) dalam array catatan yang diekspor (bug?), Jadi kami mendapat untung dari konversi jenis juga untuk memperbaiki itu.Saat ini Pandas hanya memiliki integer 8-byte
i8
,, dan mengapung,f8
(lihat masalah ini ).sumber
np.array
konstruktor.Sepertinya
df.to_records()
akan bekerja untuk Anda. Fitur persis yang Anda cari diminta danto_records
ditunjuk sebagai alternatif.Saya mencoba ini secara lokal menggunakan contoh Anda, dan panggilan itu menghasilkan sesuatu yang sangat mirip dengan output yang Anda cari:
Perhatikan bahwa ini
recarray
bukanarray
. Anda bisa memindahkan hasilnya ke array numpy biasa dengan memanggil konstruktornya sebagainp.array(df.to_records())
.sumber
to_records()
lebih dari 5 tahun sebelumnya?Coba ini:
sumber
Berikut adalah pendekatan saya untuk membuat array struktur dari panda DataFrame.
Buat bingkai data
Tentukan fungsi untuk membuat array struktur numpy (bukan array rekaman) dari panda DataFrame.
Gunakan
reset_index
untuk membuat bingkai data baru yang menyertakan indeks sebagai bagian dari datanya. Konversi bingkai data itu ke susunan struktur.EDIT: Diperbarui df_to_sarray untuk menghindari kesalahan memanggil .encode () dengan python 3. Terima kasih kepada Joseph Garvin dan halcyon untuk komentar dan solusi mereka.
sumber
Dua cara untuk mengkonversi frame data ke representasi array Numpy.
mah_np_array = df.as_matrix(columns=None)
mah_np_array = df.values
Doc: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.as_matrix.html
sumber
Cara Sederhana untuk Contoh DataFrame:
MENGGUNAKAN:
DAPATKAN:
sumber
Hanya memiliki masalah yang sama ketika mengekspor dari dataframe ke arcgis table dan menemukan solusi dari usgs ( https://my.usgs.gov/confluence/display/cdi/pandas.DataFrame+to+ArcGIS+Table ). Singkatnya masalah Anda memiliki solusi serupa:
sumber
Saya membaca jawaban di atas. Metode " as_matrix () " berfungsi tetapi sudah usang sekarang. Bagi saya, Apa yang berhasil adalah " .to_numpy () ".
Ini mengembalikan array multidimensi. Saya lebih suka menggunakan metode ini jika Anda membaca data dari lembar excel dan Anda perlu mengakses data dari indeks apa pun. Semoga ini membantu :)
sumber
Selanjutnya untuk jawaban meteore, saya menemukan kode
tidak bekerja untuk saya. Jadi saya meletakkan kode saya di sini untuk kenyamanan orang lain yang terjebak dengan masalah ini.
sumber
Cara sederhana untuk mengonversi dataframe menjadi array numpy:
Penggunaan to_numpy didorong untuk menjaga konsistensi.
Referensi: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_numpy.html
sumber
Coba ini:
Beberapa informasi lebih lanjut di: [ https://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html] Berlaku untuk numpy 1.16.5 dan panda 0.25.2.
sumber