запишите местоположение условной записи в пандах - PullRequest
0 голосов
/ 19 сентября 2018

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

enter image description here

, и я хочу просмотреть каждую строку и напечатать [i, j]положение не-NaN записи.здесь в идеале цикл должен был бы печатать «G56» и «G51».

До сих пор я создал фрейм данных T / F, в котором записаны все значения, отличные от NaN, как True:

df_na = df.notnull()

, и я могу получить индекс строки для любых истин:

for index, row in df_na.iterrows():
    if row.any() == True:
        print(index)

но я не могу получить имя столбца.(Я также обеспокоен этим подходом, так как iterrows () медленнее, чем itertuples ().

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Используя notnull, вернуть Boolean, затем sum и срез с индексом

df.index[df.notnull().sum(1).nonzero()]
Out[646]: Int64Index([56, 61], dtype='int64')
0 голосов
/ 19 сентября 2018

Настройка

df = pd.DataFrame(np.nan, range(54, 62), [*'ABCDEFGHIJ'])
df.at[56, 'G'] = 3
df.at[61, 'G'] = 2

any с axis=1

df.index[df.notna().any(1)]

Int64Index([56, 61], dtype='int64')

Печать

print(*df.index[df.notna().any(1)], sep='\n')

56
61

Более обычно

numpy.where

i, j = np.where(df.notna())
print(*zip(df.index[i], df.columns[j]), sep='\n')

(56, 'G')
(61, 'G')

stack

По умолчанию stack сбрасывает нулевые значения

print(*df.stack().index.values, sep='\n')

(56, 'G')
(61, 'G')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...