Как применить метод для подсчета количества нулевых значений между одним значением в pandas? - PullRequest
1 голос
/ 12 февраля 2020

Этот является аналогичным ответом на мой вопрос. Тем не менее, я хочу сделать все это в методе apply и написать метод для него.

У меня есть DataFrame, подобный этому:

data = {'username':['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
                    'b', 'b', 'b', 'b', 'b','b', 'b', 'b', 'b', 'b'],
        'purchase_condition':[0, 0, 0, 1, 0, 0, 1, 0, 0,
                              0, 0, 0, 0, 1, 1, 1, 0, 0, 1]}
data = pd.DataFrame(data)
data['expected_results'] = [0, 0, 0, 3, 0, 0, 2, 0, 0,
                     0, 0, 0, 0, 4, 0, 0, 0, 0, 2]

данные выглядят так:

     username  purchase_condition  expected_results
0         a                   0                 0
1         a                   0                 0
2         a                   0                 0
3         a                   1                 3
4         a                   0                 0
5         a                   0                 0
6         a                   1                 2
7         a                   0                 0
8         a                   0                 0
9         b                   0                 0
10        b                   0                 0
11        b                   0                 0
12        b                   0                 0
13        b                   1                 4
14        b                   1                 0
15        b                   1                 0
16        b                   0                 0
17        b                   0                 0
18        b                   1                 2

столбец expected_results создан на основе следующего объяснения:

Для каждого username, Для каждой строки, если purchase_condition равно 1, я считаю число 0 с между этой строкой и предыдущим 1 и помещаю это число в столбец expected_results ,

Например,

  1. В 4-й строке (строка № 3) expected_results равно 3, потому что первые 3 строки purchase_condition 0.
  2. В 7-й строке (строка № 6) expected_results равно 2, потому что между строкой № 6 и строкой № 3 2 строки, у которых purchase_condition равно 0.
  3. В 15-й строке (строка # 14), expected_results равно 0, потому что, хотя purchase_condition равно 1, значение предыдущей строки (строки # 13) purchase_condition также равно 1.

Is можно сделать это методом apply или использовать какой-нибудь cumsum?

1 Ответ

4 голосов
/ 12 февраля 2020

Метод apply - это петли под капотом, поэтому, если возможно, лучше избегать его в pandas.


Сначала вы можете сравнить по Series.eq (==) для m, затем получить маску m1 для первых значений последовательных True и False маски, получить последовательные группы с Series.cumsum до s.

Last подсчитывает их по Series.value_counts и повторяет по группам с Series.map, Series.shift и устанавливает только для первых 1 с цепочкой обоих маска & для побитового И в numpy.where:

m = data['purchase_condition'].eq(1)
m1 = m.ne(m.groupby(data['username']).shift())
s = m1.cumsum()
data['new'] = np.where(m1 & m, s.map(s.value_counts()).shift(), 0).astype(int)

print (data)
   username  purchase_condition  expected_results  new
0         a                   0                 0    0
1         a                   0                 0    0
2         a                   0                 0    0
3         a                   1                 3    3
4         a                   0                 0    0
5         a                   0                 0    0
6         a                   1                 2    2
7         a                   0                 0    0
8         a                   0                 0    0
9         b                   0                 0    0
10        b                   0                 0    0
11        b                   0                 0    0
12        b                   0                 0    0
13        b                   1                 4    4
14        b                   1                 0    0
15        b                   1                 0    0
16        b                   0                 0    0
17        b                   0                 0    0
18        b                   1                 2    2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...