Python, панды находят длину каждой строки на основе критерия остановки - PullRequest
1 голос
/ 12 июня 2019

У меня есть набор данных, где -1 означает точку, где мне нужно прекратить чтение. Например, набор данных выглядит так:

          0   1   2    3    4  5
0       58  68  58   59   -1 -1
1       59  69  59   -1   -1 -1
2       93  94  93   33   -1 -1
3       58  59  58   68   -1 -1
4       92  94  92   33   -1 -1

где -1 в столбце 4 означает прекращение чтения элементов.

Точнее, я хочу вернуть длину для строки (сколько элементов существует, пока не появится -1) для всех строк.

Таким образом, первая строка имеет длину 4 (4 элемента до -1). Строка два имеет длину 3. Строка три имеет длину 4 и т. Д.

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

Как я могу сделать что-то подобное в пандах (так что избегайте опции long for loop?)

Я хотел бы заранее поблагодарить вас за вашу помощь. С уважением Alex

Ответы [ 2 ]

2 голосов
/ 12 июня 2019

Другой подход включает вычитание суммы True из df.shape[1]:

df.assign(new=df.shape[1]-df.eq(-1).sum(axis=1))

    0   1   2   3  4  5  new
0  58  68  58  59 -1 -1    4
1  59  69  59  -1 -1 -1    3
2  93  94  93  33 -1 -1    4
3  58  59  58  68 -1 -1    4
4  92  94  92  33 -1 -1    4
2 голосов
/ 12 июня 2019

numpy.argmax

Можно сравнить значения DataFrame с -1, а затем использовать numpy.argmax, чтобы получить число ненулевых значений в строке.

(df.values == -1).argmax(axis=1)
# array([4, 3, 4, 4, 4])

Назначение этого обратно,

df['num_vals'] = (df.values == -1).argmax(axis=1))
df

    0   1   2   3  4  5  num_vals
0  58  68  58  59 -1 -1         4
1  59  69  59  -1 -1 -1         3
2  93  94  93  33 -1 -1         4
3  58  59  58  68 -1 -1         4
4  92  94  92  33 -1 -1         4

Это работает, всегда возвращая индекс столбца первого -1, найденного в каждой строке, поэтому более общий.


.cumsum(axis=1) + .max(axis=1)

df['num_vals'] = (df != -1).cumsum(axis=1).max(axis=1)
df

    0   1   2   3  4  5  num_vals
0  58  68  58  59 -1 -1         4
1  59  69  59  -1 -1 -1         3
2  93  94  93  33 -1 -1         4
3  58  59  58  68 -1 -1         4
4  92  94  92  33 -1 -1         4

Предполагается, что ваши значения -1 всегда находятся в конце соответствующих строк.

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