2016-01-07 9 views
5

Potrzebuję konwertować dane przechowywane w pandas.DataFrame na ciąg bajtowy, gdzie każda kolumna może mieć osobny typ danych (liczba całkowita lub zmiennoprzecinkowa). Oto prosty zestaw danych:Konwersja pandas.DataFrame na bajty

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') 

i df wygląda mniej więcej tak:

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

DataFrame wie o rodzajach każdej kolumnie df.dtypes więc chciałbym zrobić coś takiego:

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() 

zazwyczaj działa dobrze, ale w tym przypadku (z uwagi na wartości maksymalnej przechowywanej w df['b'][0]. druga linia powyżej przekształcenie tablicę krotki do np.array z danego zbioru typów powoduje następujący błąd:

OverflowError: Python int too large to convert to C long 

Wyniki błędach (wierzę) w pierwszej linii, która wydobywa się nagrać jako Series z jednego typu danych (domyślnie float64) a reprezentacja wybrana w float64 dla maksymalnej wartości uint64 nie jest bezpośrednio przekształcalna z powrotem na uint64.

1) Ponieważ DataFrame zna już typy każdej kolumny, czy istnieje sposób na obejście tworzenia wiersza krotek dla wprowadzenia do wpisanego konstruktora numpy.array? Czy istnieje lepszy sposób niż opisany powyżej, aby zachować informacje o typie w takiej konwersji?

2) Czy istnieje sposób, aby przejść bezpośrednio z DataFrame do ciągu bajtów reprezentujących dane przy użyciu informacji o typie dla każdej kolumny.

Odpowiedz

2

Można użyć df.to_records() zamienić dataframe do numpy recarray, a następnie zadzwonić .tostring() przekonwertować to ciąg bajtów:

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 
Powiązane problemy