Подсчитайте, сколько начальных элементов в серии Pandas равно определенному значению? - PullRequest
1 голос
/ 13 июля 2020

Как задано. Я знаю, как это вычислить, но есть ли способ сделать это лучше / быстрее / элегантнее? Cnt - результат.

s = pd.Series( np.random.randint(2, size=10) )
cnt = 0
for n in s:
        if n != 0:
            break
        else:
            cnt += 1
            continue

Ответы [ 3 ]

3 голосов
/ 13 июля 2020

Используйте Series.eq, чтобы создать boolean mask, затем используйте Series.cummin, чтобы вернуть совокупный минимум по этой серии, наконец, используйте Series.sum для получить общее количество:

cnt = s.eq(0).cummin().sum()

Пример:

np.random.seed(9)
s = pd.Series(np.random.randint(2, size=10))

# print(s)
0    0
1    0
2    0
3    1
4    0
5    0
6    1
7    0
8    1
9    1
dtype: int64

cnt = s.eq(0).cummin().sum()
#print(cnt)
3
2 голосов
/ 13 июля 2020

Вы можете использовать cumsum() в маске, а затем sum(), чтобы получить количество начальных нулей в последовательности:

s = pd.Series(np.random.randint(2, size=10))
(s.cumsum() == 0).sum()

Обратите внимание, что этот метод работает только в том случае, если вы хотите подсчитать нули. Если вы хотите подсчитать вхождения ненулевых значений, вы можете обобщить это, ie.:

(s.sub(s[0]).cumsum() == 0).sum()

2 голосов
/ 13 июля 2020

Я сделал в кадре данных, так как его легче создать, но вы можете использовать векторизованный .cumsum, чтобы ускорить свой код с помощью .loc для значений == 0. Затем просто найдите длину с помощью len:

import pandas as pd, numpy as np
s = pd.DataFrame(pd.Series(np.random.randint(2, size=10)))
s['t'] = s[0].cumsum()
o = len(s.loc[s['t']==0])
o

Если вы установите o = в столбец с s['o'] = o, то результат будет выглядеть так:

    0   t   o
0   0   0   2
1   0   0   2
2   1   1   2
3   1   2   2
4   0   2   2
5   1   3   2
6   1   4   2
7   1   5   2
8   1   6   2
9   0   6   2
...