Преобразуйте последнее ненулевое значение в 0 для каждой строки в панде DataFrame - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь изменить свой фрейм данных таким образом, чтобы последняя переменная объекта, закодированного в метке, была преобразована в 0. Например, у меня есть этот фрейм данных, верхняя строка - метки, а первый столбец - индекс:

df
   1  2  3  4  5  6  7  8  9  10
0  0  1  0  0  0  0  0  0  1   1
1  0  0  0  1  0  0  0  0  0   0
2  0  0  0  0  0  0  0  0  1   0

Колонки 1-10 - это те, которые были закодированы.То, во что я хочу преобразовать этот фрейм данных, без изменения чего-либо еще:

   1  2  3  4  5  6  7  8  9  10
0  0  1  0  0  0  0  0  0  1   0
1  0  0  0  0  0  0  0  0  0   0
2  0  0  0  0  0  0  0  0  0   0

Таким образом, последние значения, встречающиеся в каждой строке, должны быть преобразованы в 0. Я думал об использовании метода last_valid_index, но этовзял бы другие оставшиеся столбцы и изменил бы это, что я не хочу.Любая помощь приветствуется

1 Ответ

0 голосов
/ 18 февраля 2019

Вы можете использовать cumsum для создания логической маски и установить ее на ноль.

v = df.cumsum(axis=1)
df[v.lt(v.max(axis=1), axis=0)].fillna(0, downcast='infer')

   1  2  3  4  5  6  7  8  9  10
0  0  1  0  0  0  0  0  0  1   0
1  0  0  0  0  0  0  0  0  0   0
2  0  0  0  0  0  0  0  0  0   0

Еще одна похожая опция - реверсирование перед вызовом cumsum, теперь вы можете сделать это в одной строке.

df[~df.iloc[:, ::-1].cumsum(1).le(1)].fillna(0, downcast='infer')

   1  2  3  4  5  6  7  8  9  10
0  0  1  0  0  0  0  0  0  1   0
1  0  0  0  0  0  0  0  0  0   0
2  0  0  0  0  0  0  0  0  0   0

Если у вас есть больше столбцов, просто применитеэти операции на срезе.Позже назначьте обратно.

u = df.iloc[:, :10]
df[u.columns] = u[~u.iloc[:, ::-1].cumsum(1).le(1)].fillna(0, downcast='infer')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...