Давайте использовать np.where
для логического фрейма данных, который указывает последнее ненулевое значение, за которым следует NaN в строке.
r, c = np.where((df.isnull().shift(-1, axis=1) & df.notnull()).dropna(axis=1))
list(zip(df.index[r], df.columns[c]))
Вывод:
[(0, 'B'),
(0, 'F'),
(1, 'A'),
(1, 'F'),
(2, 'C'),
(2, 'F'),
(3, 'B'),
(3, 'F')]
Подробности:
Используйте эту логическую логику для создания кадра данных с логическим значением show True для индексов, которые вы хотите вывести.
(df.isnull().shift(-1, axis=1) & df.notnull())
Вывод:
A B C D E F G
0 False True False False False True NaN
1 True False False False False True NaN
2 False False True False False True NaN
3 False True False False False True NaN
Используйте dropna
дляудалите столбец G и затем используйте np.where
, чтобы получить значения индекса истинных местоположений в приведенном выше кадре данных.Наконец, используйте df.index и df.columns для получения меток индексов в местоположениях, возвращаемых np.where, затем zip
для создания кортежей и list
.