Получение индекса и столбцов на основе условного

#python #pandas

#python #pandas

Вопрос:

Используя DF в качестве примера ниже, как я могу получить список с индексом и именем столбца значений, которые не являются nan?

                   es  ms        hs
subdist_id                        
1                NaN NaN       NaN
2                NaN NaN       NaN
3          -0.218066 NaN -0.309002
4                NaN NaN       NaN
5                NaN NaN       NaN
6                NaN NaN       NaN
7                NaN NaN       NaN
9                NaN NaN       NaN
10               NaN NaN       NaN
11         -0.385217 NaN       NaN
  

итак, я могу получить список [[3,'es]', [3,'hs'], [11,'es']]

Ответ №1:

Используйте DataFrame.stack для удаления NANS с преобразованием MultiIndex в список кортежей, а затем преобразуйте его в список списков:

 L = list(map(list, df.stack().index.tolist()))
print (L)
[[3, 'es'], [3, 'hs'], [11, 'es']]
  

Альтернатива:

 L = [list(x) for x in df.stack().index.tolist()]
print (L)
[[3, 'es'], [3, 'hs'], [11, 'es']]
  

Если требуется производительность, получите индексы по условию с помощью DataFrame.isna и numpy.where и получите значения по zip с индексацией значений столбцов и индекса:

 i,c = np.where(df.notna())
L = list(map(list, zip(df.index[i],df.columns[c])))
print (L)
[[3, 'es'], [3, 'hs'], [11, 'es']]
  

 i,c = np.where(df.notna())
L = [list(x) for x in zip(df.index[i],df.columns[c])]