Saya telah memanipulasi beberapa data menggunakan panda dan sekarang saya ingin melakukan batch save kembali ke database. Ini mengharuskan saya untuk mengubah kerangka data menjadi array tupel, dengan masing-masing tupel sesuai dengan "baris" dari kerangka data.
DataFrame saya terlihat seperti:
In [182]: data_set
Out[182]:
index data_date data_1 data_2
0 14303 2012-02-17 24.75 25.03
1 12009 2012-02-16 25.00 25.07
2 11830 2012-02-15 24.99 25.15
3 6274 2012-02-14 24.68 25.05
4 2302 2012-02-13 24.62 24.77
5 14085 2012-02-10 24.38 24.61
Saya ingin mengubahnya menjadi array tupel seperti:
[(datetime.date(2012,2,17),24.75,25.03),
(datetime.date(2012,2,16),25.00,25.07),
...etc. ]
Adakah saran tentang bagaimana saya dapat melakukan ini secara efisien?
list(df.itertuples(index=False, name=None))
df.to_records(index=False)
dan daftar dikte:df.to_dict('records')
Jawaban:
Bagaimana tentang:
untuk panda <0,24 digunakan
sumber
.itertuples
, yang akan lebih efisien daripada mendapatkan nilai-nilai sebagai array dan mengubahnya menjadi tuple.Pada 17.1, yang di atas akan mengembalikan daftar namedTuple .
Jika Anda ingin daftar tupel biasa, sampaikan
name=None
sebagai argumen:sumber
tuple
dizip
iterator Anda (bukannamedtuple
s), maka hubungi:data_set.itertuples(index=False, name=None)
itertuples
lambat . Hindari jika memungkinkan. Untuk loop (seperti yang ditunjukkan pada jawaban yang diterima) biasanya lebih cepat dalam kasus ini.Cara umum:
sumber
data_set.to_records(index=False).tolist()
lebih baik?Motivasi
Banyak set data yang cukup besar yang perlu kita perhatikan dengan kecepatan / efisiensi. Jadi saya menawarkan solusi ini dalam semangat itu. Itu kebetulan juga ringkas.
Demi perbandingan, mari letakkan
index
kolomSolusi
Saya akan mengusulkan penggunaan
zip
danmap
Kebetulan juga fleksibel jika kita ingin berurusan dengan subset kolom tertentu. Kami akan menganggap kolom yang sudah kami tampilkan adalah subset yang kami inginkan.
Apa yang lebih cepat?
Turn keluar
records
paling cepat diikuti oleh konvergen asimtotikzipmap
daniter_tuples
Saya akan menggunakan perpustakaan
simple_benchmarks
yang saya dapatkan dari posting iniPeriksa hasilnya
sumber
Berikut ini pendekatan Vectorized (dengan asumsi dataframe,
data_set
untuk didefinisikan sebagaidf
gantinya) bahwa return suatulist
darituples
seperti yang ditunjukkan:menghasilkan:
Gagasan menetapkan kolom datetime sebagai sumbu indeks adalah untuk membantu dalam konversi
Timestamp
nilai kedatetime.datetime
format yang sesuai dengan memanfaatkanconvert_datetime64
argumenDF.to_records
yang digunakan untukDateTimeIndex
kerangka data.Ini mengembalikan
recarray
yang bisa kemudian dibuat untuk kembalilist
menggunakan.tolist
Solusi yang lebih umum tergantung pada use case adalah:
sumber
Cara paling efisien dan mudah:
Anda dapat memfilter kolom yang Anda butuhkan sebelum panggilan ini.
sumber
Jawaban ini tidak menambahkan jawaban apa pun yang belum dibahas, tetapi berikut adalah beberapa hasil kecepatan. Saya pikir ini harus menyelesaikan pertanyaan yang muncul di komentar. Semua ini terlihat seperti O (n) , berdasarkan pada tiga nilai ini.
TL; DR :
tuples = list(df.itertuples(index=False, name=None))
dantuples = list(zip(*[df[c].values.tolist() for c in df]))
terikat untuk yang tercepat.Saya melakukan tes kecepatan cepat pada hasil untuk tiga saran di sini:
tuples = list(zip(*[df[c].values.tolist() for c in df]))
tuples = [tuple(x) for x in df.values]
name=None
saran dari @Axel:tuples = list(df.itertuples(index=False, name=None))
Ukuran kecil:
Memberi:
Lebih besar:
Memberi:
Sebanyak kesabaran yang saya miliki:
Memberi:
Versi zip dan versi itertuples berada dalam interval kepercayaan satu sama lain. Saya curiga mereka melakukan hal yang sama di bawah tenda.
Tes kecepatan ini mungkin tidak relevan. Mendorong batas memori komputer saya tidak membutuhkan banyak waktu, dan Anda benar - benar tidak boleh melakukan ini pada kumpulan data besar. Bekerja dengan tupel setelah melakukan ini akan menjadi sangat tidak efisien. Ini tidak mungkin menjadi hambatan utama dalam kode Anda, jadi tetaplah dengan versi yang Anda pikir paling mudah dibaca.
sumber
[*zip(*map(df.get, df))]
untuk beberapa saat sekarang. Ngomong-ngomong, kupikir kau akan menganggapnya menarik.sumber
Mengubah daftar bingkai data menjadi daftar tupel.
sumber
Lebih banyak cara pythonic:
sumber
map()
terkenal unpythonic.