DataFrame Oluşturmanın Doğru Yolu ™
TLDR; (sadece kalın metni okuyun)
Buradaki yanıtların çoğu size boş bir DataFrame'in nasıl oluşturulacağını ve dolduracağını söyleyecektir, ancak kimse bunun kötü bir şey olduğunu söylemeyecektir.
İşte tavsiyem: Çalışmanız gereken tüm verilere sahip olduğunuzdan emin olana kadar bekleyin. Verilerinizi toplamak için bir liste kullanın, ardından hazır olduğunuzda bir DataFrame başlatın.
data = []
for a, b, c in some_function_that_yields_data():
data.append([a, b, c])
df = pd.DataFrame(data, columns=['A', 'B', 'C'])
Öyle bir listeye ekler ve tek seferde bir DataFrame oluşturmak için her zaman daha ucuz o tekrar tekrar kendisine boş bir DataFrame (veya NaN'ler ait biri) ve append yaratmaktır daha. Listeler de daha az bellek kaplar ve çalışmak , eklemek ve kaldırmak (gerekirse) için çok daha hafif bir veri yapısıdır .
Bu yöntemin diğer avantajı dtypes
otomatik olarak çıkarılır ( object
hepsine atamak yerine ).
Geçen avantaj olduğunu bir RangeIndex
otomatik veri için oluşturulan yaklaşık endişe için bir daha az şey (kötü bakmak yani, append
ve loc
, uygun şekilde indeksi ele gerektiren hem de elemanlarını göreceksiniz aşağıda yöntemlerle).
YAPMAMANIZ GEREKENLER
append
veya concat
bir döngü içinde
İşte yeni başlayanlardan gördüğüm en büyük hata:
df = pd.DataFrame(columns=['A', 'B', 'C'])
for a, b, c in some_function_that_yields_data():
df = df.append({'A': i, 'B': b, 'C': c}, ignore_index=True) # yuck
# or similarly,
# df = pd.concat([df, pd.Series({'A': i, 'B': b, 'C': c})], ignore_index=True)
Bellek, sahip olduğunuz her işlem append
veya concat
işlem için yeniden ayrılır . Bunu bir döngü ile birleştirin ve ikinci dereceden karmaşıklık işleminiz var . Gönderen df.append
doc sayfa :
Bir DataFrame'e satırları art arda eklemek, tek bir birleştirme işleminden daha fazla hesaplama açısından yoğun olabilir. Daha iyi bir çözüm, bu satırları bir listeye eklemek ve ardından listeyi orijinal DataFrame ile bir kerede birleştirmektir.
İle ilişkili diğer bir hata df.append
, kullanıcıların ekleme eklemeyi unutma eğiliminde olmalarının yerinde bir işlev olmamasıdır , bu nedenle sonuç geri atanmalıdır. Ayrıca türler hakkında endişelenmelisiniz:
df = pd.DataFrame(columns=['A', 'B', 'C'])
df = df.append({'A': 1, 'B': 12.3, 'C': 'xyz'}, ignore_index=True)
df.dtypes
A object # yuck!
B float64
C object
dtype: object
Nesne sütunlarıyla uğraşmak asla iyi bir şey değildir, çünkü pandalar bu sütunlardaki işlemleri vektörleştiremez. Düzeltmek için bunu yapmanız gerekecek:
df.infer_objects().dtypes
A int64
B float64
C object
dtype: object
loc
bir döngü içinde
Ayrıca loc
boş oluşturulmuş bir DataFrame eklemek için kullanılan gördük :
df = pd.DataFrame(columns=['A', 'B', 'C'])
for a, b, c in some_function_that_yields_data():
df.loc[len(df)] = [a, b, c]
Daha önce olduğu gibi, her seferinde ihtiyacınız olan bellek miktarını önceden ayırmadınız, böylece her yeni satır oluşturduğunuzda bellek yeniden büyür . O kadar kötü append
ve hatta daha çirkin.
NaN'lerin Boş Veri Çerçevesi
Ve sonra, NaN'lerin bir DataFrame'i ve onunla ilişkili tüm uyarılar var.
df = pd.DataFrame(columns=['A', 'B', 'C'], index=range(5))
df
A B C
0 NaN NaN NaN
1 NaN NaN NaN
2 NaN NaN NaN
3 NaN NaN NaN
4 NaN NaN NaN
Diğerleri gibi, nesne sütunlarının bir DataFrame'ini oluşturur.
df.dtypes
A object # you DON'T want this
B object
C object
dtype: object
Eklemek yukarıdaki yöntemler gibi tüm sorunları hala var.
for i, (a, b, c) in enumerate(some_function_that_yields_data()):
df.iloc[i] = [a, b, c]
Kanıt, puding içerisindedir
Bu yöntemleri zamanlamak, bellekleri ve yardımcı programları açısından ne kadar farklı olduklarını görmenin en hızlı yoludur.
Referans için karşılaştırma kodu.