Crear diccionario a partir de los resultados de DataFrame en pandas.

Tengo un dataframe con resultados como abajo. El dataframe de muestra que se muestra uno real es mucho más grande. Quiero obtener un diccionario (u otra estructura si será más rápido) con los valores que son todos los elementos que pasan los criterios (ubicados en los encabezados de las columnas) y que las claves son las filas del dataframe.

AAPL GOOG MSFT AMZN FB 1 NaN NaN 9.731 NaN NaN 2 NaN 4.5 NaN 3.486 NaN 3 4.331 NaN NaN 3.26 5.967 4 NaN NaN NaN NaN 3.61 

Y los resultados que querría son los siguientes

 {1:[MSFT], 2:[GOOG,AMZN], 3:[AAPL, AMZN, FB], 4:[FB]} 

Quizás no sea el mejor en términos de rendimiento, pero podría usar iterrows:

 import numpy as np results = {} for i, row in df.iterrows(): results[i] = list(df.columns[~np.isnan(row)]) 

Puede realizar una indexación booleana en las columnas de marcos de datos en una comprensión de diccionario.

 >>> {idx: df.columns[row].tolist() for idx, row in df.notnull().iterrows()} {1: ['MSFT'], 2: ['GOOG', 'AMZN'], 3: ['AAPL', 'AMZN', 'FB'], 4: ['FB']} 

Puede obtener el producto de puntos de máscara y columnas y luego usar operaciones de cadena, es decir,

 df.notna().dot(df.columns+',').str.strip(',').str.split(',').to_dict() {1: ['MSFT'], 2: ['GOOG', 'AMZN'], 3: ['AAPL', 'AMZN', 'FB'], 4: ['FB']} 
 df.stack().reset_index(level=1).groupby(level=0).level_1.apply(list).to_dict() Out[764]: {1: ['MSFT'], 2: ['GOOG', 'AMZN'], 3: ['AAPL', 'AMZN', 'FB'], 4: ['FB']} 

Puedes usar .apply

 df.apply(lambda x: list(x.dropna().index), axis=1).to_dict() #Updated answer # Or dict(df.apply(lambda x: list(x.index[~x.isnull()]), axis=1)) #Original answer 

Salida:

 {1: ['MSFT'], 2: ['GOOG', 'AMZN'], 3: ['AAPL', 'AMZN', 'FB'], 4: ['FB']}