Найти индекс первого значения NaN в строке - PullRequest
0 голосов
/ 09 июня 2018

У меня есть фрейм данных, который выглядит так:

table = pd.DataFrame({'a':[0,0,0,0],
                      'b':[1,1,1,3,],
                      'c':[2,2,5,4],
                      'd':[3,np.NaN,6,6],
                      'e':[4,np.NaN, 7,8],
                      'f':[np.NaN,np.NaN,np.NaN,10,]}, dtype='float64')


    a   b   c   d   e   f
0   0.0 1.0 2.0 3.0 4.0 NaN
1   0.0 1.0 2.0 NaN NaN NaN
2   0.0 1.0 5.0 6.0 7.0 NaN
3   0.0 3.0 4.0 6.0 8.0 10.0

Для каждой строки я пытаюсь найти индекс столбца для первого значения NaN.Так что я могу сохранить это значение в переменной, чтобы использовать его позже.

Пока я пробовал этот кусок кода, но он не дает мне именно то, что я хочу ... Я не хочу массив, простозначение.

for i in table.itertuples():
    x = np.where(np.isnan(i))
    print(x)

(array([6]),)
(array([4, 5, 6]),)
(array([6]),)
(array([], dtype=int64),)

Заранее благодарим за любые комментарии / советы!

Ответы [ 3 ]

0 голосов
/ 09 июня 2018

Использование:

t = np.isnan(table.values).argmax(axis=1)
print (t)
[5 3 5 0]

Но, если необходимо, добавьте одно значение для не NaN s строк:

t = np.isnan(table.reset_index().values).argmax(axis=1)
print (t)
[6 4 6 0]
0 голосов
/ 09 июня 2018

Я получил то, что хочу, изменив свой бит кода и используя argmax(), как упомянуто @hpaulj:

for i in table.itertuples():
    x = np.isnan(i).argmax(axis=0)
    print(x)

#6
#4
#6
#0

Спасибо всем за вашу помощь!

0 голосов
/ 09 июня 2018

Проверьте na, получите индекс максимального значения по строке и отфильтруйте строки, у которых вообще нет na.

table.isna().idxmax(1).where(table.isna().any(1))

#0      f
#1      d
#2      f
#3    NaN
#dtype: object

Или, если вам нужны индексы столбцов, как прокомментировано@hpaulj, вы можете использовать argmax:

import numpy as np
is_missing = table.isna().values
np.where(is_missing.any(1), is_missing.argmax(1), np.nan)

# array([ 5.,  3.,  5., nan])
...