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 .