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.