Sıfır dolu Pandalar veri çerçevesi oluşturma


106

Belirli bir boyutta sıfır dolgulu bir panda veri çerçevesi oluşturmanın en iyi yolu nedir?

Kullandım:

zero_data = np.zeros(shape=(len(data),len(feature_list)))
d = pd.DataFrame(zero_data, columns=feature_list)

Bunu yapmanın daha iyi bir yolu var mı?


1
Hayır, bunda önemli bir gelişme düşünemiyorum.
Dan Allan

Veriler büyük bir set olduğu için np.zeros'ta bir Bellek Hatası alıyorum. Ne yapabileceğime dair herhangi bir ipucu var mı? "MemoryError" dışında başka bir çıktı almadım. 100GB RAM'im var ve veriler sadece 20GB ama yine de başarısız. Nasıl hata ayıklanacağı hakkında hiçbir fikrim yok, 64bit ubuntu sunucusu. Google'da biraz araştırdım ama herkes diyor ki - parçalara bölün, ancak bu veriler bölünemez.
niedakh

Sadece çalışabilir datamisin? Onu tutmak için neden başka bir yapı yaratmanız gerekiyor?
Phillip Bulut

Yanıtlar:


147

Bunu deneyebilirsiniz:

d = pd.DataFrame(0, index=np.arange(len(data)), columns=feature_list)

2
Bunu test etmek %timeit temp = np.zeros((10, 11)); d = pd.DataFrame(temp, columns = ['col1', 'col2',...'col11'])156 bizi alır. Ama %timeit d = pd.DataFrame(0, index = np.arange(10), columns = ['col1', 'col2',...'col11'])171 bizi alır. Daha hızlı olmamasına şaşırdım.
emschorsch

3
0'ları içerecek şekilde d.set_value(params)başlattıktan sonra olduğu gibi bir şey yapacaksanız, int / float sorunu ile karşılaşabileceğinizi unutmayın d. Kolay bir düzeltmedir: d = pd.DataFrame(0.0, index=np.arange(len(data)), columns=feature_list).
ximiki

31

Bence bunu uyuşuk ile yapmak en iyisi

import numpy as np
import pandas as pd
d = pd.DataFrame(np.zeros((N_rows, N_cols)))

1
Bu şekilde yaptığımda "0" değerlerini değiştiremedim. TypeError: 'numpy.float64' object does not support item assignment
RightmireM

@RightmireM Onları tam olarak nasıl değiştirmeye çalışıyorsun? Doğru np.float64
söylüyorsunuz

12

@Shravan'a benzer, ancak numpy kullanmadan:

  height = 10
  width = 20
  df_0 = pd.DataFrame(0, index=range(height), columns=range(width))

O zaman onunla ne istersen yapabilirsin:

post_instantiation_fcn = lambda x: str(x)
df_ready_for_whatever = df_0.applymap(post_instantiation_fcn)

8

Yeni veri çerçevesinin mevcut bir veri çerçevesiyle aynı indekse ve sütunlara sahip olmasını isterseniz, mevcut veri çerçevesini sıfırla çarpabilirsiniz:

df_zeros = df * 0

2
Df'nin NaN'leri içerdiği her yerde sıfırlar yerine NaN'ler alacağınızı unutmayın.
kadee

1

Zaten bir veri çerçeveniz varsa, bu en hızlı yoldur:

In [1]: columns = ["col{}".format(i) for i in range(10)]
In [2]: orig_df = pd.DataFrame(np.ones((10, 10)), columns=columns)
In [3]: %timeit d = pd.DataFrame(np.zeros_like(orig_df), index=orig_df.index, columns=orig_df.columns)
10000 loops, best of 3: 60.2 µs per loop

Karşılaştırmak:

In [4]: %timeit d = pd.DataFrame(0, index = np.arange(10), columns=columns)
10000 loops, best of 3: 110 µs per loop

In [5]: temp = np.zeros((10, 10))
In [6]: %timeit d = pd.DataFrame(temp, columns=columns)
10000 loops, best of 3: 95.7 µs per loop

1

DataFrame şablonuna sahip olduğunu varsayarsak, hangisinin burada sıfır değerlerle doldurulmasını istersiniz ...

Veri kümenizde hiç NaN yoksa sıfırla çarpmak önemli ölçüde daha hızlı olabilir:

In [19]: columns = ["col{}".format(i) for i in xrange(3000)]                                                                                       

In [20]: indices = xrange(2000)

In [21]: orig_df = pd.DataFrame(42.0, index=indices, columns=columns)

In [22]: %timeit d = pd.DataFrame(np.zeros_like(orig_df), index=orig_df.index, columns=orig_df.columns)
100 loops, best of 3: 12.6 ms per loop

In [23]: %timeit d = orig_df * 0.0
100 loops, best of 3: 7.17 ms per loop

İyileştirme DataFrame boyutuna bağlıdır, ancak hiçbir zaman bu kadar yavaş olmamıştır.

Ve sadece lanet olsun:

In [24]: %timeit d = orig_df * 0.0 + 1.0
100 loops, best of 3: 13.6 ms per loop

In [25]: %timeit d = pd.eval('orig_df * 0.0 + 1.0')
100 loops, best of 3: 8.36 ms per loop

Fakat:

In [24]: %timeit d = orig_df.copy()
10 loops, best of 3: 24 ms per loop

DÜZENLE!!!

Float64 kullanan bir çerçeveye sahip olduğunuzu varsayarsak, bu büyük bir farkla en hızlısı olacaktır! Ayrıca 0.0'ı istenen doldurma numarasıyla değiştirerek herhangi bir değer üretebilir.

In [23]: %timeit d = pd.eval('orig_df > 1.7976931348623157e+308 + 0.0')
100 loops, best of 3: 3.68 ms per loop

Zevkinize bağlı olarak, belirli bir şamandıra türünden bağımsız olarak nan'ı harici olarak tanımlayabilir ve genel bir çözüm yapabilir:

In [39]: nan = np.nan
In [40]: %timeit d = pd.eval('orig_df > nan + 0.0')
100 loops, best of 3: 4.39 ms per loop

1
Bu kesinlikle zamanlamayla ilgili en kapsamlı cevaptır, ancak OP için sorun bellek gereksinimleri gibi görünüyor ve hız değil ... Bu arada, sistemimde yazdığınız ilk iki öneri aynı zamanlamayı veriyor (Pandalar 0.20.3 ), belki de bazı değişiklikler olmuştur.
Moot
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.