2013-06-18 15 views
16

Uzaktan algılama zaman serisi analizi için Pandas kütüphanesi kullanıyorum. Sonunda, DataFrame'imi yığın boyutlarını kullanarak csv'ye kaydetmek istiyorum, ancak küçük bir sorunla karşılaşıyorum. Kodum, Pandas Serisine dönüştüğüm 6 NumPy dizisi oluşturur. Bu Serisinin her bir Pandalar DataFram (df) içine Serisi eklemek istiyorum öğelerSerisi ile DataFrame oluşturmak için Panda'ları kullanma, bellek hatasıyla sonuçlanıyor

>>> prcpSeries.shape 
(12626172,) 

bir sürü içerir bu yüzden bir csv dosyasına yığın tarafından onlara yığın kaydedebilirsiniz.

d = {'prcp': pd.Series(prcpSeries), 
    'tmax': pd.Series(tmaxSeries), 
    'tmin': pd.Series(tminSeries), 
    'ndvi': pd.Series(ndviSeries), 
    'lstm': pd.Series(lstmSeries), 
    'evtm': pd.Series(evtmSeries)} 

df = pd.DataFrame(d) 
outFile ='F:/data/output/run1/_'+str(i)+'.out' 
df.to_csv(outFile, header = False, chunksize = 1000) 
d = None 
df = None 

Ama benim kod Bellek Hatası

df = pd.DataFrame(d) 

herhangi bir öneriniz vererek aşağıdaki çizgisinde takılıp? Pandas DataFrame parçasını yığın ile doldurmak mümkün mü?

+1

tek sütunundan bir DataFrame yapabilir: burada alternatif (concat kullanarak) bir dış birleşim yerine sonra DataFrame her oluşturmak ve bir pd.DataFrane ({'tmax': pd.Series (tmaxSeries)})? –

+0

evet, bu – Mattijn

+1

çalışır, ilk dizili bir çerçeve oluşturun ve bunları sırasıyla ekleyin, ör. '' df = DataFrame ({'prcp': pd.Series (prcpSeries)}); df ['tmax'] = pd.Series (tmaxSeries) ''. Her halükarda bir HDF5'e yazmalısınız, bakınız: http://pandas.pydata.org/pandas-docs/dev/io.html#hdf5-pytables – Jeff

cevap

17

Biliyorsanız bunların her biri aynı uzunlukta daha sonra dizisi tarafından doğrudan DataFrame oluşturabilir ve her bir sütunu ekleme aşağıdaki gibidir: (aynı zamanda to_frame yöntemi kullanabilir:

df = pd.DataFrame(prcpSeries, columns=['prcp']) 
df['tmax'] = tmaxSeries 
... 

Not hangi (isteğe bağlı olarak) bir ad geçmesine izin verir -) Serisi tane yoksa yararlıdır:

df = prcpSeries.to_frame(name='prcp') 

Ancak, eğer değişken uzunluktaysa, bu bazı veriler (prcpSeries'dan daha uzun olan diziler) kaybedecektir. Örneğin

df1 = pd.DataFrame(prcpSeries, columns=['prcp']) 
df2 = pd.DataFrame(tmaxSeries, columns=['tmax']) 
... 

df = pd.concat([df1, df2, ...], join='outer', axis=1) 

:

In [21]: dfA = pd.DataFrame([1,2], columns=['A']) 

In [22]: dfB = pd.DataFrame([1], columns=['B']) 

In [23]: pd.concat([dfA, dfB], join='outer', axis=1) 
Out[23]: 
    A B 
0 1 1 
1 2 NaN 
+0

Teşekkürler Andy ve Jeff! İkinci yaklaşımı df = pd.concat (etc.) Satırında bir Bellek Hatası aldığından, her bir sütunu ekleyerek ilk yöntemi kullanıyorum. Seriyi en uzun uzunlukta biliyorum ve bunu DataFrame'i başlatmak için kullanacağım. – Mattijn

+0

Bir uyarı: pandas sürüm 0.14.1 kullanıyorum ve bir Series nesnesini bir DataFrame nesnesine zorlamaya çalıştığımda, 'pandas.DataFrame()' çağrısında 'columns = ['my_column_name']' seçeneğini belirtirsem, Ortaya çıkan nesne boş bir DataFrame'dir. Sütun bağımsız değişkenini bıraktığımda, ortaya çıkan DataFrame beklendiği gibi oldu. – Jubbles

+0

@Jubbles Bundan bahsetmeye çalıştığınız için, belki de 'to_frame' yöntemini kullanmak için daha temizdir (orijinal cevabı yazdığımda bunun uygun olduğundan emin değilim) - Bu cevabı güncelledim. Bunun artık 0.14+ sürümünde çalışıp çalışmadığını görmek için bir bakacağım, daha sonra görmek için bir çek yapacağım. –

İlgili konular