Saya mulai dari dokumen DataFrame panda di sini: http://pandas.pydata.org/pandas-docs/stable/dsintro.html
Saya ingin secara iteratif mengisi DataFrame dengan nilai-nilai dalam jenis perhitungan time series. Jadi pada dasarnya, saya ingin menginisialisasi DataFrame dengan kolom A, B dan baris timestamp, semua 0 atau semua NaN.
Saya kemudian akan menambahkan nilai awal dan memeriksa data ini menghitung baris baru dari baris sebelumnya, katakan row[A][t] = row[A][t-1]+1
atau lebih.
Saya saat ini menggunakan kode seperti di bawah ini, tetapi saya merasa itu agak jelek dan harus ada cara untuk melakukan ini dengan DataFrame secara langsung, atau hanya cara yang lebih baik secara umum. Catatan: Saya menggunakan Python 2.7.
import datetime as dt
import pandas as pd
import scipy as s
if __name__ == '__main__':
base = dt.datetime.today().date()
dates = [ base - dt.timedelta(days=x) for x in range(0,10) ]
dates.sort()
valdict = {}
symbols = ['A','B', 'C']
for symb in symbols:
valdict[symb] = pd.Series( s.zeros( len(dates)), dates )
for thedate in dates:
if thedate > dates[0]:
for symb in valdict:
valdict[symb][thedate] = 1+valdict[symb][thedate - dt.timedelta(days=1)]
print valdict
.append
pd dan menambahkan daftar? Saya tahu.append
dalam panda menyalin seluruh dataset ke objek baru ยด, apakah ular sanca bekerja berbeda?Jawaban:
Berikut beberapa saran:
Gunakan
date_range
untuk indeks:Catatan: kita bisa membuat DataFrame kosong (dengan
NaN
s) hanya dengan menulis:Untuk melakukan jenis perhitungan ini untuk data, gunakan array numpy:
Maka kita dapat membuat DataFrame:
sumber
index
x0
(columns = []
), dan melampirkan satu kolom di setiap putaran loop. Maksud sayadf[col_name] = pandas.Series([...])
dalam satu lingkaran iterasi melalui nama kolom. Dalam kasus sebelumnya, tidak hanya alokasi memori yang membutuhkan waktu, tetapi mengganti NaNs dengan nilai-nilai baru tampaknya sangat lambat.Jika Anda hanya ingin membuat frame data kosong dan mengisinya dengan beberapa frame data yang masuk nanti, coba ini:
Dalam contoh ini saya menggunakan panda doc ini untuk membuat bingkai data baru dan kemudian menggunakan append untuk menulis ke newDF dengan data dari oldDF.
Jika saya harus terus menambahkan data baru ke dalam newDF ini dari lebih dari satu oldDFs, saya hanya menggunakan for for loop untuk beralih ke panda. DataFrame.append ()
sumber
append
(dan jugaconcat
) menyalin dataset lengkap ke objek baru setiap kali, karenanya, iterasi dan menambahkan dapat dan akan menyebabkan hit kinerja utama. untuk info lebih lanjut lihat: pandas.pydata.org/pandas-docs/stable/merging.htmlThe Right Way โข untuk Membuat DataFrame
Sebagian besar jawaban di sini akan memberi tahu Anda cara membuat DataFrame kosong dan mengisinya, tetapi tidak ada yang akan memberi tahu Anda bahwa itu adalah hal yang buruk untuk dilakukan.
Ini saran saya: Tunggu sampai Anda yakin Anda memiliki semua data yang perlu Anda kerjakan. Gunakan daftar untuk mengumpulkan data Anda, lalu inisialisasi DataFrame saat Anda siap.
Hal ini selalu lebih murah untuk menambahkan ke daftar dan membuat DataFrame di satu pergi daripada untuk membuat DataFrame kosong (atau salah satu dari NaN) dan append untuk itu lagi dan lagi. Daftar juga membutuhkan lebih sedikit memori dan struktur data yang jauh lebih ringan untuk digunakan , ditambahkan, dan dihapus (jika perlu).
Keuntungan lain dari metode ini
dtypes
disimpulkan secara otomatis (daripada menugaskanobject
mereka semua).Keuntungan terakhir adalah bahwa a
RangeIndex
secara otomatis dibuat untuk data Anda , jadi itu adalah satu hal yang kurang perlu dikhawatirkan (lihat pada orang miskinappend
danloc
metode di bawah ini, Anda akan melihat elemen di keduanya yang memerlukan penanganan indeks dengan tepat).Hal-hal yang TIDAK BISA Anda lakukan
append
atauconcat
di dalam lingkaranInilah kesalahan terbesar yang pernah saya lihat dari pemula:
Memori dialokasikan kembali untuk setiap
append
atauconcat
operasi yang Anda miliki. Pasangkan ini dengan satu lingkaran dan Anda memiliki operasi kompleksitas kuadratik . Daridf.append
halaman dokumen :Kesalahan lain yang terkait
df.append
adalah bahwa pengguna cenderung lupa menambahkan bukan fungsi di tempat , sehingga hasilnya harus ditugaskan kembali. Anda juga harus khawatir tentang dtypes:Berurusan dengan kolom objek tidak pernah merupakan hal yang baik, karena panda tidak dapat membuat vektor operasi pada kolom tersebut. Anda harus melakukan ini untuk memperbaikinya:
loc
di dalam lingkaranSaya juga telah melihat
loc
digunakan untuk menambahkan ke DataFrame yang dibuat kosong:Seperti sebelumnya, Anda belum mengalokasikan jumlah memori yang Anda butuhkan setiap kali, sehingga memori ditanam kembali setiap kali Anda membuat baris baru . Ini sama buruknya dengan
append
, dan bahkan lebih jelek.Kosongkan DataFrame dari NaNs
Dan kemudian, ada membuat DataFrame NaNs, dan semua peringatan yang terkait dengannya.
Itu membuat DataFrame dari kolom objek, seperti yang lainnya.
Menambahkan masih memiliki semua masalah seperti metode di atas.
Bukti ada di Puding
Mengatur waktu metode-metode ini adalah cara tercepat untuk melihat seberapa jauh mereka berbeda dalam hal memori dan utilitas mereka.
Kode benchmark untuk referensi.
sumber
Inisialisasi bingkai kosong dengan nama kolom
Tambahkan catatan baru ke bingkai
Anda juga mungkin ingin melewati kamus:
Tambahkan bingkai lain ke bingkai Anda yang ada
Pertimbangan kinerja
Jika Anda menambahkan baris di dalam satu lingkaran pertimbangkan masalah kinerja. Untuk sekitar 1000 rekaman pertama "my_df.loc" kinerja lebih baik, tetapi secara bertahap menjadi lebih lambat dengan menambah jumlah catatan dalam loop.
Jika Anda berencana untuk melakukan thins di dalam satu lingkaran besar (katakanlah 10Mโ record atau lebih), Anda lebih baik menggunakan campuran keduanya; isi dataframe dengan iloc sampai ukurannya mencapai sekitar 1000, lalu tambahkan ke dataframe asli, dan kosongkan temp dataframe. Ini akan meningkatkan kinerja Anda sekitar 10 kali.
sumber
my_df = my_df.append(my_df2)
tidak bekerja untuk saya kecuali saya tentukanignore_index=True
.Asumsikan kerangka data dengan 19 baris
Menjaga Kolom A sebagai konstanta
Menyimpan kolom b sebagai variabel yang diberikan oleh sebuah loop
Anda dapat mengganti x pertama
pd.Series([x], index = [x])
dengan nilai apa punsumber