Crearea unui cadru de date pandas umplut cu zero (Programare, Python, Pandas, Dataframe)

niedakh a intrebat.

Care este cel mai bun mod de a crea un cadru de date pandas umplut cu zero de o anumită dimensiune?

Am folosit:

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

Există o modalitate mai bună de a face acest lucru?

Comentarii

  • Nu, nu mă pot gândi la nicio îmbunătățire substanțială în acest sens. –  > Por Dan Allan.
  • Primesc o eroare de memorie pe np.zeros, deoarece datele sunt un set mare. Aveți vreun indiciu despre ce pot face? Nu am primit nicio altă ieșire în afară de „MemoryError”. Am 100GB de RAM și datele sunt doar 20GB, dar tot nu reușește. Nu am idee cum să o depanez, server ubuntu 64bit. Am căutat pe Google un pic, dar toată lumea spune – împărțiți în bucăți, dar aceste date nu pot fi împărțite. –  > Por niedakh.
  • Puteți lucra doar cu data? De ce trebuie să creezi o altă structură pentru a le păstra? –  > Por Phillip Cloud.
6 răspunsuri
Shravan

Puteți încerca acest lucru:

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

Comentarii

  • Testând acest lucru am găsit %timeit temp = np.zeros((10, 11)); d = pd.DataFrame(temp, columns = ['col1', 'col2',...'col11']) ne ia 156. Dar %timeit d = pd.DataFrame(0, index = np.arange(10), columns = ['col1', 'col2',...'col11']) ne ia 171. Sunt surprins că nu este mai rapid. –  > Por emschorsch.
  • Rețineți că s-ar putea să vă confruntați cu problema int/float dacă veți face ceva de genul d.set_value(params) după inițializare d pentru a conține 0-uri. O soluție ușoară este: d = pd.DataFrame(0.0, index=np.arange(len(data)), columns=feature_list). –  > Por ximiki.
AlexG

Cel mai bine este să faceți acest lucru cu numpy în opinia mea

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

Comentarii

  • Când am făcut-o în acest fel, nu am putut modifica valorile „0”. TypeError: 'numpy.float64' object does not support item assignment –  > Por RightmireM.
  • @RightmireM Cum anume încerci să le modifici? Aveți dreptate, tipul de date este np.float64 –  > Por AlexG.
WaveRider

Similar cu @Shravan, dar fără a folosi numpy:

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

Apoi, puteți face orice doriți cu el:

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

chakuRak

Dacă doriți ca noul cadru de date să aibă același index și aceleași coloane ca un cadru de date existent, puteți pur și simplu să înmulțiți cadrul de date existent cu zero:

df_zeros = df * 0

Comentarii

  • Rețineți că veți obține NaN-uri în loc de zerouri acolo unde df conține NaN-uri. –  > Por kadee.
mtd

Dacă aveți deja un cadru de date, aceasta este cea mai rapidă metodă:

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

Comparați cu:

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

Mark Horvath

Presupunând că aveți un șablon DataFrame, pe care doriți să îl copiați cu valori zero completate aici…

Dacă nu aveți NaN-uri în setul de date, înmulțirea cu zero poate fi semnificativ mai rapidă:

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

Îmbunătățirea depinde de dimensiunea DataFrame, dar nu am constatat niciodată că este mai lent.

Și doar de dragul de a fi:

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

Dar:

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

EDITARE!!!

Presupunând că aveți un cadru care utilizează float64, acesta va fi cel mai rapid cu o marjă uriașă! De asemenea, este capabil să genereze orice valoare prin înlocuirea lui 0,0 cu numărul de umplere dorit.

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

În funcție de gust, se poate defini extern nan, și se poate face o soluție generală, indiferent de tipul particular de float:

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

Comentarii

  • Acesta este cu siguranță cel mai cuprinzător răspuns cu privire la sincronizare, deși pentru OP se pare că cerințele de memorie au fost problema și nu viteza… Apropo, pe sistemul meu, primele două sugestii pe care le-ați scris dau aceeași sincronizare (Pandas 0.20.3), deci poate că au existat unele modificări. –  > Por Moot.