Saya ingin mengubah sel panda yang berisi daftar menjadi baris untuk masing-masing nilai tersebut.
Jadi, ambil ini:
Jika saya ingin membongkar dan menumpuk nilai di nearest_neighbors
kolom sehingga setiap nilai akan menjadi baris di dalam setiap opponent
indeks, bagaimana cara terbaik untuk melakukannya? Apakah ada metode panda yang dimaksudkan untuk operasi seperti ini?
pd.DataFrame(df.nearest_neighbors.values.tolist())
untuk membongkar kolom ini dan kemudianpd.merge
merekatkannya dengan yang lain.values.tolist()
tidak melakukan apa-apa di sini; kolom sudah menjadi daftarJawaban:
Pada kode di bawah ini, saya pertama kali mengatur ulang indeks untuk membuat iterasi baris lebih mudah.
Saya membuat daftar daftar di mana setiap elemen dari daftar luar adalah baris dari DataFrame target dan setiap elemen dari daftar dalam adalah salah satu kolom. Daftar bertingkat ini pada akhirnya akan digabungkan untuk membuat DataFrame yang diinginkan.
Saya menggunakan
lambda
fungsi bersama dengan daftar iterasi untuk membuat baris untuk setiap elemen yangnearest_neighbors
dipasangkan dengan yang relevanname
danopponent
.Akhirnya, saya membuat DataFrame baru dari daftar ini (menggunakan nama kolom asli dan mengatur indeks kembali ke
name
danopponent
).EDIT JUNI 2017
Metode alternatifnya adalah sebagai berikut:
sumber
apply(pd.Series)
baik-baik saja pada bingkai terkecil, tetapi untuk bingkai berukuran wajar, Anda harus mempertimbangkan kembali solusi yang lebih berkinerja. Lihat Kapan saya harus menggunakan pandas apply () di kode saya? (Solusi yang lebih baik adalah dengan mendengarkan kolom terlebih dahulu.)explode()
metode. Saya menambahkan jawaban dengan contoh menggunakan pengaturan df yang sama seperti di sini.explode()
metode:Di luar:
sumber
Gunakan
apply(pd.Series)
danstack
, lalureset_index
danto_frame
Detail
sumber
df.nearest_neighbors.apply(pd.Series)
sangat mencengangkan bagi saya;Saya pikir ini pertanyaan yang sangat bagus, di Hive yang akan Anda gunakan
EXPLODE
, saya pikir ada kasus yang harus dibuat bahwa Panda harus menyertakan fungsi ini secara default. Saya mungkin akan meledakkan kolom daftar dengan pemahaman generator bersarang seperti ini:sumber
The tercepat metode yang saya temukan sejauh memperpanjang DataFrame dengan
.iloc
dan menugaskan kembali datar kolom target.Diberikan input biasa (direplikasi sedikit):
Diberikan alternatif yang disarankan berikut ini:
Menurut saya itu
extend_iloc()
yang tercepat :sumber
cols = [c for c in df.columns if c != col_target]
harus:cols = [i for i,c in enumerate(df.columns) if c != col_target]
Thedf.iloc[ilocations, cols].copy()
kesalahan jika tidak disajikan dengan indeks kolom.Solusi alternatif yang lebih baik dengan apply (pd.Series):
sumber
Mirip dengan fungsi EXPLODE Hive:
sumber
NameError: global name 'copy' is not defined
Jadi semua jawaban ini bagus tapi saya menginginkan sesuatu ^ sangat sederhana ^ jadi inilah kontribusi saya:
Itu saja .. cukup gunakan ini ketika Anda menginginkan seri baru di mana daftarnya 'meledak'. Berikut adalah contoh di mana kami melakukan value_counts () pada pilihan taco :)
sumber
Berikut adalah potensi pengoptimalan untuk kerangka data yang lebih besar. Ini berjalan lebih cepat jika ada beberapa nilai yang sama di bidang "meledak". (Semakin besar kerangka data dibandingkan dengan jumlah nilai unik di bidang, semakin baik kinerja kode ini.)
sumber
Memperluas
.iloc
jawaban Oleg untuk secara otomatis meratakan semua kolom daftar:Ini mengasumsikan bahwa setiap kolom daftar memiliki panjang daftar yang sama.
sumber
Alih-alih menggunakan apply (pd.Series) Anda bisa meratakan kolom. Ini meningkatkan kinerja.
sumber