Devuelva la lista de índices / índice donde se produce un valor mínimo / máximo en un dataframe de pandas

Me gustaría buscar en un DataFrame de DataFrame pandas los valores mínimos. Necesito el mínimo en todo el dataframe (en todos los valores) análogo al df.min().min() . Sin embargo, también necesito conocer el índice de las ubicaciones donde se produce este valor.

He intentado una serie de enfoques diferentes:

  • df.where(df == (df.min().min())) ,
  • df.where(df == df.min().min()).notnull() ( fuente ) y
  • val_mask = df == df.min().min(); df[val_mask] val_mask = df == df.min().min(); df[val_mask] ( fuente ).

Estos devuelven un dataframe de NaN en valores no-min / booleanos, pero no puedo encontrar la manera de obtener (fila, columna) de estas ubicaciones.

¿Existe una forma más elegante de buscar en un dataframe un mínimo / máximo y devolver una lista que contenga todas las ubicaciones de los eventos?

 import pandas as pd keys = ['x', 'y', 'z'] vals = [[1,2,-1], [3,5,1], [4,2,3]] data = dict(zip(keys,vals)) df = pd.DataFrame(data) list_of_lowest = [] for column_name, column in df.iteritems(): if len(df[column == df.min().min()]) > 0: print(column_name, column.where(column ==df.min().min()).dropna()) list_of_lowest.append([column_name, column.where(column ==df.min().min()).dropna()]) list_of_lowest output: [['x', 2 -1.0 Name: x, dtype: float64]] 

Basado en su actualización revisada:

 In [209]: keys = ['x', 'y', 'z'] vals = [[1,2,-1], [3,5,-1], [4,2,3]] data = dict(zip(keys,vals)) df = pd.DataFrame(data) df Out[209]: xyz 0 1 3 4 1 2 5 2 2 -1 -1 3 

Entonces lo siguiente funcionaría:

 In [211]: df[df==df.min().min()].dropna(axis=1, thresh=1).dropna() Out[211]: xy 2 -1.0 -1.0 

Así que esto usa la máscara booleana en el df:

 In [212]: df[df==df.min().min()] Out[212]: xyz 0 NaN NaN NaN 1 NaN NaN NaN 2 -1.0 -1.0 NaN 

y llamamos a dropna con param thresh=1 esto elimina columnas que no tienen al menos 1 valor no NaN:

 In [213]: df[df==df.min().min()].dropna(axis=1, thresh=1) Out[213]: xy 0 NaN NaN 1 NaN NaN 2 -1.0 -1.0 

Probablemente sea más seguro volver a llamar con thresh=1 :

 In [214]: df[df==df.min().min()].dropna(axis=1, thresh=1).dropna(thresh=1) Out[214]: xy 2 -1.0 -1.0