Как вы находите нижний максимум и верхний максимум с помощью панд? - PullRequest
0 голосов
/ 16 октября 2018

Если у меня есть фрейм данных pandas, подобный этому:

     A    B    C    D    E   F   G
0    1    1   nan  nan   1   1  nan
1    1   nan  nan  nan   1   1  nan
2    1    1    1   nan  nan  1  nan
3    1    1   nan  nan   1   1  nan

Как получить индекс последнего значения перед моими значениями NaN и индекс последнего общего значения?

Так что я получаю возврат:

(0, B) (0, F) (1, A) (1, F) (2, C) (2, F) (3, B)(3, F)

как мои индексы.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Давайте использовать 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.

0 голосов
/ 16 октября 2018

Для первого требования используйте

>>> df.isnull().shift(-1,axis=1).fillna(False).idxmax(1)

0    B
1    A
2    C
3    B

Для второго:

df.notnull().T[::-1].T.idxmax(1)

0    F
1    F
2    F
3    F

Вы можете манипулировать этими сериями, чтобы получить ожидаемый результат, как вы хотите.Например,

>>> list(zip(s1.to_dict().items(), 
             s2.to_dict().items()))

[((0, 'B'), (0, 'F')),
 ((1, 'A'), (1, 'F')),
 ((2, 'C'), (2, 'F')),
 ((3, 'B'), (3, 'F'))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...