Bagaimana cara mengonversi Seri panda atau indeks ke array Numpy?

264

Apakah Anda tahu cara mendapatkan indeks atau kolom DataFrame sebagai array NumPy atau daftar python?

ericmjl
sumber
Apakah ini menjawab pertanyaan Anda? Konversi panda dataframe ke array NumPy
AMC
1
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  1  4
b  2  5
c  3  6

In [2]: df.index.values
Out[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.

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

Untuk mendapatkan indeks sebagai daftar, hubungi tolist:

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

Dan juga untuk kolom.

Andy Hayden
sumber
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.

bdiamante
sumber
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.

Lihat bagian ini dari catatan rilis v0.24.0 untuk informasi lebih lanjut.


to_numpy() metode

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

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

Secara default, tampilan dikembalikan. Setiap modifikasi yang dilakukan akan memengaruhi yang asli.

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

df
    A  B
-1  1  2
b   4  5

Jika Anda membutuhkan salinan, gunakan to_numpy(copy=True);

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

df
   A  B
a  1  2
b  4  5

Perhatikan bahwa fungsi ini juga berfungsi untuk DataFrames (sementara .arraytidak).


arrayAtribut Atribut
ini mengembalikanExtensionArrayobjek yang mendukung Indeks / Seri.

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

Dari sini, dimungkinkan untuk mendapatkan daftar menggunakan list:

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

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

atau, langsung saja hubungi .tolist():

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

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

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

  1. Yang ada ExtensionArraymendukung Indeks / Seri, atau
  2. 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.

cs95
sumber
48

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 dariFrozenList df.index.names

gg349
sumber
16

Karena panda v0.13 Anda juga dapat menggunakan get_values:

df.index.get_values()
yemu
sumber
5
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])

Anda memiliki nilai indeks Anda sebagai idx.

Sarvagya Gupta
sumber
dan kemudian menggunakan list.index dasar () Bagaimana itu terkait dengan pertanyaan mengubah Seri ke daftar?
AMC
0

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:

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

Anda juga bisa meneruskan tipe data, seperti float atau objek, sebagai argumen fungsi

Jon R
sumber
-1

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.

Kumar Shubham
sumber
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.
AMC