Saya mengerti bahwa panda dirancang untuk memuat yang terisi penuh DataFrame
tetapi saya harus membuat DataFrame kosong lalu menambahkan baris, satu per satu . Apa cara terbaik untuk melakukan ini?
Saya berhasil membuat DataFrame kosong dengan:
res = DataFrame(columns=('lib', 'qty1', 'qty2'))
Lalu saya bisa menambahkan baris baru dan mengisi bidang dengan:
res = res.set_value(len(res), 'qty1', 10.0)
Ini berfungsi tetapi tampaknya sangat aneh: - / (gagal untuk menambahkan nilai string)
Bagaimana saya bisa menambahkan baris baru ke DataFrame saya (dengan tipe kolom berbeda)?
Jawaban:
Anda dapat menggunakan
df.loc[i]
, di mana baris dengan indeksi
akan menjadi apa yang Anda tentukan berada dalam kerangka data.sumber
.loc
mereferensikan kolom indeks, jadi jika Anda bekerja dengan DataFrame yang sudah ada sebelumnya dengan indeks yang bukan urutan bilangan bulat dimulai dengan 0 (seperti dalam contoh Anda),.loc
akan menimpa baris yang ada, atau menyisipkan baris, atau buat celah di indeks Anda. Pendekatan yang lebih kuat (tapi bukan bukti-bukti) untuk menambahkan kerangka data non-nol yang ada adalah:df.loc[df.index.max() + 1] = [randint(...
atau mengisi ulang indeks seperti yang disarankan @FooBar.df.index.max()
adalahnan
ketika DataFrame kosong.df.loc[0 if pd.isnull(df.index.max()) else df.index.max() + 1]
Jika Anda bisa mendapatkan semua data untuk frame data di muka, ada pendekatan yang jauh lebih cepat daripada menambahkan ke frame data:
Saya memiliki tugas yang sama dengan yang menambahkan baris bingkai data demi baris memakan waktu 30 menit, dan membuat bingkai data dari daftar kamus diselesaikan dalam hitungan detik.
sumber
It is worth noting however, that concat (and therefore append) makes a full copy of the data, and that constantly reusing this function can create a significant performance hit. If you need to use the operation over several datasets, use a list comprehension.
( pandas.pydata.org/pandas-docs/stable/… )Anda bisa menggunakan
pandas.concat()
atauDataFrame.append()
. Untuk detail dan contoh, lihat Menggabungkan, bergabung, dan menggabungkan .sumber
.loc
mekanisme yang bisa dihindari, terutama jika Anda berhati-hati.DataFrame.append()
, Anda harus memastikan data baris Anda juga merupakan DataFrame di tempat pertama, bukan daftar.Sudah lama, tapi saya menghadapi masalah yang sama juga. Dan menemukan banyak jawaban menarik di sini. Jadi saya bingung metode apa yang digunakan.
Dalam hal menambahkan banyak baris ke kerangka data saya tertarik pada kinerja kecepatan . Jadi saya mencoba 4 metode paling populer dan memeriksa kecepatannya.
DIPERBARUI PADA 2019 menggunakan versi paket baru. Juga diperbarui setelah komentar @FooBar
KINERJA KECEPATAN
Hasil (dalam detik):
Juga terima kasih kepada @krassowski untuk komentar yang bermanfaat - Saya memperbarui kodenya.
Jadi saya menggunakan tambahan melalui kamus untuk diri saya sendiri.
Kode:
PS Saya percaya, realisasiku tidak sempurna, dan mungkin ada beberapa optimasi.
sumber
df2.index.max()
untuk secara.loc
tidak perlu meningkatkan kompleksitas komputasi. Sederhanadf2.loc[i] = ...
akan berhasil. Bagi saya itu mengurangi waktu dari 10s menjadi 8,64sJika Anda tahu jumlah entri ex ante, Anda harus melakukan prealokasi spasi dengan memberikan indeks (mengambil contoh data dari jawaban yang berbeda):
Perbandingan kecepatan
Dan - seperti dari komentar - dengan ukuran 6000, perbedaan kecepatan menjadi lebih besar:
sumber
sumber
Untuk penambahan yang efisien, lihat Cara menambahkan baris tambahan ke bingkai data panda dan Pengaturan Dengan Pembesaran .
Tambahkan baris melalui
loc/ix
pada data indeks kunci yang tidak ada . misalnya:Atau:
sumber
Anda dapat menambahkan satu baris sebagai kamus menggunakan
ignore_index
opsi.sumber
f.append(<stuff>)
membuat objek baru, bukan hanya menambahkan objek saat ini di tempat, jadi jika Anda mencoba menambahkan bingkai data dalam skrip, Anda perlu mengatakanf = f.append(<stuff>)
Demi cara Pythonic, di sini tambahkan jawaban saya:
sumber
Anda juga dapat membuat daftar daftar dan mengonversinya menjadi kerangka data -
memberi
sumber
Ini bukan jawaban untuk pertanyaan OP tetapi contoh mainan untuk menggambarkan jawaban @ShikharDua di atas yang menurut saya sangat berguna.
Meskipun fragmen ini sepele, dalam data aktual saya memiliki 1.000 baris, dan banyak kolom, dan saya berharap dapat mengelompokkan berdasarkan kolom yang berbeda dan kemudian melakukan statistik di bawah ini untuk lebih dari satu kolom taget. Jadi memiliki metode yang dapat diandalkan untuk membangun kerangka data satu per satu adalah kenyamanan yang luar biasa. @ShikharDua terima kasih!
sumber
Menemukan cara sederhana dan menyenangkan:
sumber
Anda dapat menggunakan objek generator untuk membuat Dataframe, yang akan lebih efisien dalam daftar.
Untuk menambahkan mentah ke DataFrame yang ada, Anda dapat menggunakan metode append.
sumber
Buat catatan baru (bingkai data) dan tambahkan ke old_data_frame .
lulus daftar nilai dan nama kolom yang sesuai untuk membuat new_record (data_frame)
sumber
Inilah cara untuk menambah / menambahkan baris
pandas DataFrame
Ini dapat digunakan untuk menyisipkan / menambahkan baris dalam dataFrame panda yang kosong atau terisi
sumber
Alih-alih daftar kamus seperti dalam jawaban ShikharDua, kami juga dapat mewakili tabel kami sebagai kamus daftar , di mana setiap daftar menyimpan satu kolom dalam urutan baris, mengingat kami tahu kolom kami sebelumnya. Pada akhirnya kami membangun DataFrame kami sekali.
Untuk c kolom dan n baris, ini menggunakan 1 kamus dan c daftar, dibandingkan 1 daftar dan n kamus. Daftar metode kamus membuat setiap kamus menyimpan semua kunci dan mengharuskan pembuatan kamus baru untuk setiap baris. Di sini kita hanya menambahkan daftar, yang merupakan waktu konstan dan secara teoritis sangat cepat.
sumber
jika Anda ingin menambahkan baris di akhir tambahkan sebagai daftar
sumber
Cara lain untuk melakukannya (mungkin tidak terlalu performan):
Anda juga dapat meningkatkan kelas DataFrame seperti ini:
sumber
Yang Anda butuhkan adalah
loc[df.shape[0]]
atauloc[len(df)]
atau
sumber
Sederhanakan. Dengan mengambil daftar sebagai input yang akan ditambahkan sebagai baris dalam bingkai data: -
sumber
Kita sering melihat konstruk
df.loc[subscript] = …
untuk menetapkan satu baris DataFrame. Mikhail_Sam memposting tolok ukur yang berisi, antara lain, konstruksi ini serta metode menggunakan dict dan membuat DataFrame pada akhirnya . Dia menemukan yang terakhir menjadi yang tercepat sejauh ini. Tetapi jika kita menggantidf3.loc[i] = …
(dengan DataFrame preallocated) dalam kodenyadf3.values[i] = …
, hasilnya berubah secara signifikan, dalam metode yang melakukan mirip dengan yang menggunakan dict. Jadi kita harus lebih sering mempertimbangkan penggunaandf.values[subscript] = …
. Namun, perhatikan bahwa.values
dibutuhkan subskrip berbasis nol, yang mungkin berbeda dari DataFrame.index.sumber
# .loc with prealloc
), contoh lain adalah dalam pertanyaan saya harus membandingkan data dari setiap baris DataFrame Pandas dengan data dari sisa baris, apakah ada cara untuk mempercepat perhitungan ? dan jawaban yang diterima.pandas.DataFrame.append
DataFrame.append (diri sendiri, lainnya, ign_index = Salah, verifikasi_integritas = Salah, sortir = Salah) → 'DataFrame'
Dengan Abaikan_indeks disetel ke True:
sumber
sebelum menambahkan baris, kita harus mengonversi dataframe ke kamus di sana Anda dapat melihat kunci sebagai kolom dalam dataframe dan nilai-nilai kolom lagi disimpan dalam kamus tetapi ada kunci untuk setiap kolom adalah nomor indeks dalam dataframe. Gagasan itu membuat saya menulis kode di bawah ini.
sumber
Anda dapat menggabungkan dua DataFrames untuk ini. Saya pada dasarnya menemukan masalah ini untuk menambahkan baris baru ke DataFrame yang ada dengan indeks karakter (bukan numerik). Jadi, saya memasukkan data untuk baris baru di saluran () dan indeks dalam daftar.
sumber
Ini akan membantu menambahkan item ke DataFrame kosong. Masalahnya adalah bahwa
df.index.max() == nan
untuk indeks pertama:sumber