CATATAN: Harus mengonversi Pandas DataFrame ke array (atau daftar) seperti ini dapat menjadi indikasi masalah lainnya. Saya sangat merekomendasikan memastikan bahwa DataFrame adalah struktur data yang sesuai untuk kasus penggunaan khusus Anda, dan bahwa Pandas tidak termasuk cara apa pun untuk melakukan operasi yang Anda minati.
AMC
Jawaban:
353
Untuk mendapatkan array NumPy, Anda harus menggunakan valuesatribut:
In[1]: df = pd.DataFrame({'A':[1,2,3],'B':[4,5,6]}, index=['a','b','c']); df
A B
a 14
b 25
c 36In[2]: df.index.valuesOut[2]: array(['a','b','c'], dtype=object)
Ini mengakses bagaimana data sudah disimpan, jadi tidak perlu konversi.
Catatan: Atribut ini juga tersedia untuk banyak objek panda lainnya.
Catatan: .valuessudah usang, .to_numpy()adalah penggantian yang disarankan jika Anda ingin array NumPy. Bisakah Anda memperluas ini mengakses bagaimana data sudah disimpan, sehingga tidak perlu konversi ?
AMC
The jawaban dengan cs95 memberikan penjelasan besar .values, .to_numpy()dan .array.
AMC
75
Anda bisa menggunakan df.indexuntuk mengakses objek indeks dan kemudian mendapatkan nilai dalam daftar menggunakan df.index.tolist(). Demikian pula, Anda dapat menggunakan df['col'].tolist()untuk Seri.
Ia mengembalikan instanceMethod dan bukan array daftar
V Shreyas
12
@VShreyas, bagaimanadf.index.values.tolist()
LancelotHolmes
3
df.index.tolist()tidak mengembalikan metode contoh. Ini mengembalikan daftar indeks. Ini adalah metode yang didefinisikan pada indeks panda. Sementara memanggil nilai terlebih dahulu adalah suatu kemungkinan, mendelegasikan pekerjaan ke numpy bukanlah koreksi - hanya sebuah alternatif.
ayhan
51
panda> = 0,24
Hentikan penggunaan Anda .valuesdemi metode ini!
Dari v0.24.0 dan seterusnya, kami akan memiliki dua baru, metode disukai merek memukul untuk memperoleh NumPy array dari Index, Series, dan DataFramebenda-benda: mereka to_numpy(), dan .array. Mengenai penggunaan, dokumen menyebutkan:
Kami belum menghapus atau mengurangi Series.valuesatau
DataFrame.values, tetapi kami sangat merekomendasikan dan menggunakan .arrayatau
.to_numpy()sebagai gantinya.
Mengenai apa yang dikembalikan, dokumen menyebutkan,
Untuk Seriesdan Indexdidukung oleh array NumPy normal, Series.array
akan mengembalikan yang baru arrays.PandasArray, yang merupakan pembungkus tipis (tanpa salinan) di sekitar a numpy.ndarray. arrays.PandasArraytidak terlalu berguna sendiri, tetapi ia menyediakan antarmuka yang sama dengan array ekstensi apa pun yang ditentukan dalam panda atau oleh perpustakaan pihak ketiga.
Jadi, untuk meringkas, .arrayakan kembali juga
Yang ada ExtensionArraymendukung Indeks / Seri, atau
Jika ada array NumPy yang mendukung seri, ExtensionArrayobjek baru dibuat sebagai pembungkus tipis di atas array yang mendasarinya.
Dasar pemikiran untuk menambahkan DUA metode baru
Fungsi-fungsi ini ditambahkan sebagai hasil diskusi di bawah dua masalah GitHub GH19954 dan GH23623 .
Secara khusus, dokumen menyebutkan alasannya:
[...] dengan .valuesitu tidak jelas apakah nilai yang dikembalikan akan menjadi array aktual, beberapa transformasi, atau salah satu array kustom panda (seperti Categorical). Misalnya, dengan PeriodIndex, .values
menghasilkan ndarrayobjek periode baru setiap kali. [...]
Kedua fungsi ini bertujuan untuk meningkatkan konsistensi API, yang merupakan langkah besar ke arah yang benar.
Terakhir, .valuestidak 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.
Jika Anda berurusan dengan kerangka data multi-indeks, Anda mungkin tertarik untuk mengekstraksi hanya kolom satu nama multi-indeks. Anda dapat melakukan ini sebagai
df.index.get_level_values('name_sub_index')
dan tentu saja name_sub_indexharus menjadi elemen dariFrozenListdf.index.names
Apakah ada perbedaan antara ini dan. Nilai? (Saya memperbarui info versi, karena fungsi ini muncul dari 0.13.0 dokumen.)
Andy Hayden
@Andy Hayden: Bukankah satu perbedaan yang .get_values adalah cara resmi untuk mendapatkan hanya nilai saat ini sementara .values (misalnya pada multi-indeks) dapat mengembalikan nilai indeks yang baris atau kolomnya telah dihapus?
Yehezkiel Kruglick
@EzekielKruglick jadi selalu salinan? Tertaut ke dokumentasi sangat ringan, saya tidak berpikir Anda mendapatkan dupes seperti itu (bahkan jika mereka berada di MI mereka tidak akan berada dalam nilai.) Akan bagus untuk melihat contoh yang menunjukkan ini!
Andy Hayden
@AndyHayden: Saya pikir saya salah membaca komentar Anda. Anda benar, .values baik, .level memberi usang dan get_values memberi Anda nilai saat ini dengan benar tidak termasuk baris / cols yang hilang. Masalah github asli: github.com/pydata/pandas/issues/3686 Tapi saya baru saja memeriksa dan sepertinya nilai. (Tentu saja!) Memberikan info terkini hanya dalam bentuk yang berbeda dari yang saya kira adalah apa yang kita bicarakan
Yehezkiel Kruglick
1
@AndyHayden Tidak, tidak ada perbedaan. get_valueshanya menelpon .values. Itu lebih banyak karakter untuk diketik.
cs95
0
Saya mengkonversi panda dataframeke listdan kemudian menggunakan dasar list.index(). Sesuatu seperti ini:
dd = list(zone[0])#Where zone[0] is some specific column of the table
idx = dd.index(filename[i])
Di bawah ini adalah cara sederhana untuk mengubah kolom dataframe menjadi array numpy.
df = pd.DataFrame(somedict)
ytrain = df['label']
ytrain_numpy = np.array([x for x in ytrain['label']])
ytrain_numpy adalah array yang numpy.
Saya mencoba dengan to.numpy()tetapi memberi saya kesalahan di bawah ini:
TypeError: tidak ada konversi yang didukung untuk jenis: (dtype ('O'),) saat melakukan klasifikasi Binary Relevance menggunakan Linear SVC. to.numpy () mengubah dataFrame menjadi array numpy tetapi tipe data elemen dalam daftar karena kesalahan yang diamati di atas.
Saya mencoba dengan to.numpy () tapi itu memberi saya kesalahan di bawah ini: TypeError: tidak ada konversi yang didukung untuk jenis: (dtype ('O'),) saat melakukan klasifikasi Binary Relevance menggunakan Linear SVC. to.numpy () mengubah dataFrame menjadi array numpy tetapi tipe data elemen dalam daftar karena kesalahan yang diamati di atas. Tapi itu bukan kesalahan to_numpy.
Jawaban:
Untuk mendapatkan array NumPy, Anda harus menggunakan
values
atribut:Ini mengakses bagaimana data sudah disimpan, jadi tidak perlu konversi.
Catatan: Atribut ini juga tersedia untuk banyak objek panda lainnya.
Untuk mendapatkan indeks sebagai daftar, hubungi
tolist
:Dan juga untuk kolom.
sumber
.values
sudah usang,.to_numpy()
adalah penggantian yang disarankan jika Anda ingin array NumPy. Bisakah Anda memperluas ini mengakses bagaimana data sudah disimpan, sehingga tidak perlu konversi ?.values
,.to_numpy()
dan.array
.Anda bisa menggunakan
df.index
untuk mengakses objek indeks dan kemudian mendapatkan nilai dalam daftar menggunakandf.index.tolist()
. Demikian pula, Anda dapat menggunakandf['col'].tolist()
untuk Seri.sumber
df.index.values.tolist()
df.index.tolist()
tidak mengembalikan metode contoh. Ini mengembalikan daftar indeks. Ini adalah metode yang didefinisikan pada indeks panda. Sementara memanggil nilai terlebih dahulu adalah suatu kemungkinan, mendelegasikan pekerjaan ke numpy bukanlah koreksi - hanya sebuah alternatif.panda> = 0,24
Hentikan penggunaan Anda
.values
demi metode ini!Dari v0.24.0 dan seterusnya, kami akan memiliki dua baru, metode disukai merek memukul untuk memperoleh NumPy array dari
Index
,Series
, danDataFrame
benda-benda: merekato_numpy()
, dan.array
. Mengenai penggunaan, dokumen menyebutkan:Lihat bagian ini dari catatan rilis v0.24.0 untuk informasi lebih lanjut.
to_numpy()
metodeSecara default, tampilan dikembalikan. Setiap modifikasi yang dilakukan akan memengaruhi yang asli.
Jika Anda membutuhkan salinan, gunakan
to_numpy(copy=True
);Perhatikan bahwa fungsi ini juga berfungsi untuk DataFrames (sementara
.array
tidak).array
Atribut Atributini mengembalikan
ExtensionArray
objek yang mendukung Indeks / Seri.Dari sini, dimungkinkan untuk mendapatkan daftar menggunakan
list
:atau, langsung saja hubungi
.tolist()
:Mengenai apa yang dikembalikan, dokumen menyebutkan,
Jadi, untuk meringkas,
.array
akan kembali jugaExtensionArray
mendukung Indeks / Seri, atauExtensionArray
objek baru dibuat sebagai pembungkus tipis di atas array yang mendasarinya.Dasar pemikiran untuk menambahkan DUA metode baru
Fungsi-fungsi ini ditambahkan sebagai hasil diskusi di bawah dua masalah GitHub GH19954 dan GH23623 .
Secara khusus, dokumen menyebutkan alasannya:
Kedua fungsi ini bertujuan untuk meningkatkan konsistensi API, yang merupakan langkah besar ke arah yang benar.
Terakhir,
.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.sumber
Jika Anda berurusan dengan kerangka data multi-indeks, Anda mungkin tertarik untuk mengekstraksi hanya kolom satu nama multi-indeks. Anda dapat melakukan ini sebagai
dan tentu saja
name_sub_index
harus menjadi elemen dariFrozenList
df.index.names
sumber
Karena panda v0.13 Anda juga dapat menggunakan
get_values
:sumber
get_values
hanya menelpon.values
. Itu lebih banyak karakter untuk diketik.Saya mengkonversi panda
dataframe
kelist
dan kemudian menggunakan dasarlist.index()
. Sesuatu seperti ini:Anda memiliki nilai indeks Anda sebagai
idx
.sumber
Cara yang lebih baru untuk melakukan ini adalah dengan menggunakan fungsi .to_numpy ().
Jika saya memiliki kerangka data dengan kolom 'harga', saya dapat mengonversinya sebagai berikut:
Anda juga bisa meneruskan tipe data, seperti float atau objek, sebagai argumen fungsi
sumber
Di bawah ini adalah cara sederhana untuk mengubah kolom dataframe menjadi array numpy.
ytrain_numpy adalah array yang numpy.
Saya mencoba dengan
to.numpy()
tetapi memberi saya kesalahan di bawah ini: TypeError: tidak ada konversi yang didukung untuk jenis: (dtype ('O'),) saat melakukan klasifikasi Binary Relevance menggunakan Linear SVC. to.numpy () mengubah dataFrame menjadi array numpy tetapi tipe data elemen dalam daftar karena kesalahan yang diamati di atas.sumber
to_numpy
.