Tengo una trama de datos pandas con columnas identificadas como garrapatas, agua y temperatura, con unos pocos millones de filas (posiblemente mil millones en un conjunto completo de datos), pero se ve algo como esto
...
'Ticks' 'Water' 'Temp'
215 4 26.2023
216 1 26.7324
217 17 26.8173
218 2 26.9912
219 48 27.0111
220 1 27.2604
221 19 27.7563
222 32 28.3002
...
(Todas las temperaturas están en orden ascendente, y todo 'garrapatas' también están espaciadas linealmente y en orden ascendente también)
Lo que estoy tratando de hacer es reducir los datos a un único valor 'Agua' para cada plantas ha, valor entero 'Temp', y sólo el primer valor 'tick' (o el último, que en realidad no tiene mucho de un efecto sobre el análisis).
La dirección de la corriente que estoy trabajando en hacer esto es empezar en la primera fila y guardar el valor de la señal, comprobar si la temperatura es un número entero mayor valor que el anterior, agregue el valor del agua, pase a la siguiente fila comprobar el valor de la temperatura , agregue el valor del agua si no es un mayor número entero. Si el valor de la temperatura es un valor entero superior, añada el valor guardado 'tick' y el valor de la temperatura entero y el recuento de agua sumada a una nueva trama de datos.
Estoy seguro de que esto funciona, pero, estoy pensando que debe haber una manera de hacer esto mucho más eficiente el uso de algún tipo de aplicación de df.loc
o df.iloc
ya que todo está muy bien en orden ascendente.
Mi salida esperanzadora para esto sería un conjunto de datos mucho más corto con valores que ser algo como esto:
...
'Ticks' 'Water' 'Temp'
215 24 26
219 68 27
222 62 28
...
new_df = (df.groupby(df['Temp'].astype(int))
.agg({'Ticks' : 'first', 'Water' : 'sum'})
#.agg(Ticks = ('Ticks', 'first'), Water = ('Water', 'sum'))
.reset_index()
.reindex(columns=df.columns)
)
print(new_df)
Salida
Ticks Water Temp
0 215 24 26
1 219 68 27
2 222 32 28