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.