the from data convert array python pandas

from - pandas python



Pandas convertir dataframe en una matriz de tuplas (7)

He manipulado algunos datos usando pandas y ahora quiero llevar a cabo un ahorro por lotes en la base de datos. Esto requiere que convierta el marco de datos en una matriz de tuplas, con cada tupla correspondiente a una "fila" del marco de datos.

My DataFrame se ve algo así como:

In [182]: data_set Out[182]: index data_date data_1 data_2 0 14303 2012-02-17 24.75 25.03 1 12009 2012-02-16 25.00 25.07 2 11830 2012-02-15 24.99 25.15 3 6274 2012-02-14 24.68 25.05 4 2302 2012-02-13 24.62 24.77 5 14085 2012-02-10 24.38 24.61

Quiero convertirlo en una matriz de tuplas como:

[(datetime.date(2012,2,17),24.75,25.03), (datetime.date(2012,2,16),25.00,25.07), ...etc. ]

¿Alguna sugerencia sobre cómo puedo hacer esto de manera eficiente?


Aquí hay un enfoque vectorizado (suponiendo que el dataframe, data_set se definirá como df lugar) que devuelve una list de tuples como se muestra:

>>> df.set_index([''data_date''])[[''data_1'', ''data_2'']].to_records().tolist()

produce:

[(datetime.datetime(2012, 2, 17, 0, 0), 24.75, 25.03), (datetime.datetime(2012, 2, 16, 0, 0), 25.0, 25.07), (datetime.datetime(2012, 2, 15, 0, 0), 24.99, 25.15), (datetime.datetime(2012, 2, 14, 0, 0), 24.68, 25.05), (datetime.datetime(2012, 2, 13, 0, 0), 24.62, 24.77), (datetime.datetime(2012, 2, 10, 0, 0), 24.38, 24.61)]

La idea de establecer la columna de fecha y hora como el eje de índice es para ayudar a convertir el valor de convert_datetime64 de Timestamp a su correspondiente formato de datetime.datetime y datetime.datetime y datetime.datetime utilizando el argumento DF.to_records en DF.to_records que lo hace para un dataframe DateTimeIndex .

Esto devuelve un recarray que luego se puede hacer para devolver una list usando .tolist

Una solución más generalizada según el caso de uso sería:

df.to_records().tolist() # Supply index=False to exclude index


Manera más pythonic:

df = data_set[[''data_date'', ''data_1'', ''data_2'']] map(tuple,df.values)


Qué tal si:

subset = data_set[[''data_date'', ''data_1'', ''data_2'']] tuples = [tuple(x) for x in subset.values]


Una forma genérica

[tuple(x) for x in data_set.to_records(index=False)]


Motivación
Muchos conjuntos de datos son lo suficientemente grandes como para que tengamos que preocuparnos por la velocidad / eficiencia. Entonces ofrezco esta solución en ese espíritu. Pasa a ser también sucinto.

En aras de la comparación, dejemos caer la columna de index

df = data_set.drop(''index'', 1)

Solución
Propondré el uso de zip y una comprensión

list(zip(*[df[c].values.tolist() for c in df])) [(''2012-02-17'', 24.75, 25.03), (''2012-02-16'', 25.0, 25.07), (''2012-02-15'', 24.99, 25.15), (''2012-02-14'', 24.68, 25.05), (''2012-02-13'', 24.62, 24.77), (''2012-02-10'', 24.38, 24.61)]

También es flexible si queremos tratar con un subconjunto específico de columnas. Asumiremos que las columnas que ya hemos mostrado son el subconjunto que queremos.

list(zip(*[df[c].values.tolist() for c in [''data_date'', ''data_1'', ''data_2''])) [(''2012-02-17'', 24.75, 25.03), (''2012-02-16'', 25.0, 25.07), (''2012-02-15'', 24.99, 25.15), (''2012-02-14'', 24.68, 25.05), (''2012-02-13'', 24.62, 24.77), (''2012-02-10'', 24.38, 24.61)]

Todo lo siguiente produce los mismos resultados

  • [tuple(x) for x in df.values]
  • df.to_records(index=False).tolist()
  • list(map(tuple,df.values))
  • list(map(tuple, df.itertuples(index=False)))

¿Qué es más rápido?
zip y comprensión es más rápido por un gran margen

%timeit [tuple(x) for x in df.values] %timeit list(map(tuple, df.itertuples(index=False))) %timeit df.to_records(index=False).tolist() %timeit list(map(tuple,df.values)) %timeit list(zip(*[df[c].values.tolist() for c in df]))

datos pequeños

10000 loops, best of 3: 55.7 µs per loop 1000 loops, best of 3: 596 µs per loop 10000 loops, best of 3: 38.2 µs per loop 10000 loops, best of 3: 54.3 µs per loop 100000 loops, best of 3: 12.9 µs per loop

datos grandes

10 loops, best of 3: 58.8 ms per loop 10 loops, best of 3: 43.9 ms per loop 10 loops, best of 3: 29.3 ms per loop 10 loops, best of 3: 53.7 ms per loop 100 loops, best of 3: 6.09 ms per loop


#try this one: tuples = list(zip(data_set["data_date"], data_set["data_1"],data_set["data_2"])) print (tuples)


list(data_set.itertuples(index=False))

A partir del 17.1, lo anterior arrojará una lista de tics nombrados - vea los docs .