Tengo un diccionario (pollution) con una clave que deseo ignorar (chemical_start_time) y todas las demás claves tienen valores que son marcos de datos de pandas.

Quiero obtener el valor máximo presente en cualquiera de los marcos de datos y el valor mínimo distinto de cero.

Creo que el siguiente código hace exactamente esto, pero estoy buscando la forma más eficiente o "pitónica" de hacerlo

import numpy as np

max_pols = []
min_pols = []

for key, df in pollution.items():
    if key != 'chemical_start_time':
        max_pols.append(max(df.max()))
        min_pols.append(np.nanmin(df[df > 0].min()))

max_pol = max(max_pols)
min_pol = min(min_pols)
1
edc505 4 oct. 2019 a las 13:38

3 respuestas

La mejor respuesta

Una posible solución para mejorar el rendimiento es usar numpy.ravel para la matriz 1d de todos los valores de DataFrame y luego use np.min (si es posible, faltan valores np.nanmin) y np.max:

df1 = pd.DataFrame({
         'C':[7,8,9,4,2,3],
         'D':[10,3,5,-7,10,0],
         'E':[5,-3,6,9,2,4],
})

df2 = pd.DataFrame({
         'A':[73,8,9,4,2,3],
         'D':[1,3,52,-7,1,0],
         'E':[53,-33,63,9,2,4],
})
pollution = {'a':df1, 'b':df2, 'chemical_start_time':pd.DataFrame([100])}

max_pols = []
min_pols = []

for key, df in pollution.items():
    if key != 'chemical_start_time':
        v = df.values.ravel()
        max_pols.append(np.max(v))
        min_pols.append(np.min(v[v > 0]))

max_pol = np.max(max_pols)
min_pol = np.min(min_pols)

print (max_pol)
73
print (min_pol)
1
2
jezrael 4 oct. 2019 a las 12:07

También puedes usar:

max_pols.append(df.max().max())
min_pols.append(df[df > 0].min().min())
1
ansev 4 oct. 2019 a las 10:43

Combine todos los marcos de datos relevantes en uno:

frames = pd.concat([frame for key, frame in pollution.items() if key != 'chemical_start_time'])

Luego obtenga los valores max, min:

max_pol = frames.max().max()
min_pol = frames[frames > 0].min().min()
0
adrianp 4 oct. 2019 a las 10:52
58234760