#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])]