2016-01-07 27 views
5

Ho bisogno di convertire i dati memorizzati in un pandas.DataFrame in una stringa di byte in cui ogni colonna può avere un tipo di dati separato (intero o virgola mobile). Ecco un semplice insieme di dati:Conversione di pandas.DataFrame in byte

df = pd.DataFrame([ 10, 15, 20], dtype='u1', columns=['a']) 
df['b'] = np.array([np.iinfo('u8').max, 230498234019, 32094812309], dtype='u8') 
df['c'] = np.array([1.324e10, 3.14159, 234.1341], dtype='f8') 

e df simile a questa:

a   b     c 
0 10 18446744073709551615 1.324000e+10 
1 15 230498234019   3.141590e+00 
2 20 32094812309    2.341341e+02 

Il DataFrame sa circa i tipi di ogni colonna df.dtypes così mi piacerebbe fare qualcosa di simile a questo:

data_to_pack = [tuple(record) for _, record in df.iterrows()] 
data_array = np.array(data_to_pack, dtype=zip(df.columns, df.dtypes)) 
data_bytes = data_array.tostring() 

Ciò funziona tipicamente bene, ma in questo caso (a causa del valore massimo memorizzato df['b'][0]. la seconda linea sopra convertire la matrice di tuple ad un np.array con un dato insieme di tipi causa il seguente errore:

OverflowError: Python int too large to convert to C long 

L'errore (Credo) nella prima riga che estrae il record come Series con un singolo tipo di dati (default float64) e la rappresentazione scelta in float64 per il valore massimo uint64 non è direttamente riconvertibile in uint64.

1) Poiché lo DataFrame conosce già i tipi di ciascuna colonna, c'è un modo per aggirare la creazione di una fila di tuple da immettere nel costruttore numpy.array digitato? O c'è un modo migliore di quello descritto sopra per preservare le informazioni sul tipo in tale conversione?

2) C'è un modo per passare direttamente da DataFrame a una stringa di byte che rappresenta i dati utilizzando le informazioni sul tipo per ogni colonna.

risposta

2

È possibile utilizzare df.to_records() per convertire il vostro dataframe a un recArray NumPy, quindi chiamare .tostring() convertire questo in una stringa di byte:

rec = df.to_records(index=False) 

print(repr(rec)) 
# rec.array([(10, 18446744073709551615, 13240000000.0), (15, 230498234019, 3.14159), 
# (20, 32094812309, 234.1341)], 
#   dtype=[('a', '|u1'), ('b', '<u8'), ('c', '<f8')]) 

s = rec.tostring() 
rec2 = np.fromstring(s, rec.dtype) 

print(np.all(rec2 == rec)) 
# True 
Problemi correlati