Подсчет количества строк, удовлетворяющих условию, и присвоение каждой строке числа от 1 до nRows pandas - PullRequest
0 голосов
/ 07 декабря 2018

Итак, еще раз, у меня есть еще один вопрос, связанный с этим: я обрабатываю DataFrame, который выглядит следующим образом:

enter image description here

вещьв том, что теперь я хочу добавить дополнительный столбец с именем 'position', в котором, согласно contributor_id и количеству правок, появляется номер соответствующей строки.Дело в том, что теперь я не хочу, чтобы количество строк перезапускалось до тех пор, пока значение в nEdits не станет больше 0, и это число должно быть повторно установлено на 1 при изменении contributor_id:

    contributor_id  timestamp   nEdits   Position
0           8        2018-01-01   1          1
1           8        2018-02-01   1          2
2           8        2018-03-01   1          3
3           8        2018-04-01   1          4
4           8        2018-05-01   1          5
5           8        2018-06-01   1          6
6           8        2018-07-01   1          7
7           8        2018-08-01   1          8
8       26424341     2018-01-01   0          0
9       26424341     2018-02-01   0          0
10      26424341     2018-03-01   11         1
11      26424341     2018-04-01   34         2
12      26424341     2018-05-01   42         3
13      26424341     2018-06-01   46         4
14      26424341     2018-07-01   50         5
15      26424341     2018-08-01   54         6
16      26870381     2018-01-01   465        1
17      26870381     2018-02-01   566        2
18      26870381     2018-03-01   601        3

Идея, которую я получил из некоторых ответов для вычисления столбца position, заключается в следующем: df.groupby("contributor_id").position.cumsum() Но я не знаю, как включить условие, что nEdits должно быть больше 0, чтобы перезапустить счет.

1 Ответ

0 голосов
/ 07 декабря 2018

Используйте GroupBy.cumcount по столбцу contributor_id и помощнику Series для удаленного кратного 0 в той же группе:

m = df['nEdits'] == 0
df['Position1'] = np.where(m, 0, df.groupby([m.ne(m.shift()).cumsum(), 
                                             'contributor_id']).cumcount() + 1)
print (df)
    contributor_id   timestamp  nEdits  Position  Position1
0                8  2018-01-01       1         1          1
1                8  2018-02-01       1         2          2
2                8  2018-03-01       1         3          3
3                8  2018-04-01       1         4          4
4                8  2018-05-01       1         5          5
5                8  2018-06-01       1         6          6
6                8  2018-07-01       1         7          7
7                8  2018-08-01       1         8          8
8         26424341  2018-01-01       0         0          0
9         26424341  2018-02-01       0         0          0
10        26424341  2018-03-01      11         1          1
11        26424341  2018-04-01      34         2          2
12        26424341  2018-05-01       0         3          0 <- added 0 for more general data
13        26424341  2018-06-01      46         4          1
14        26424341  2018-07-01      50         5          2
15        26424341  2018-08-01      54         6          3
16        26870381  2018-01-01     465         1          1
17        26870381  2018-02-01     566         2          2
18        26870381  2018-03-01     601         3          3

Подробности :

print (m.ne(m.shift()).cumsum())
0     1
1     1
2     1
3     1
4     1
5     1
6     1
7     1
8     2
9     2
10    3
11    3
12    4
13    5
14    5
15    5
16    5
17    5
18    5
Name: nEdits, dtype: int32

Проверить разницу:

m = df['nEdits'] == 0
df['Position1'] = np.where(m, 0, df.groupby([m, 'contributor_id']).cumcount() + 1)
print (df)
    contributor_id   timestamp  nEdits  Position  Position1
0                8  2018-01-01       1         1          1
1                8  2018-02-01       1         2          2
2                8  2018-03-01       1         3          3
3                8  2018-04-01       1         4          4
4                8  2018-05-01       1         5          5
5                8  2018-06-01       1         6          6
6                8  2018-07-01       1         7          7
7                8  2018-08-01       1         8          8
8         26424341  2018-01-01       0         0          0
9         26424341  2018-02-01       0         0          0
10        26424341  2018-03-01      11         1          1
11        26424341  2018-04-01      34         2          2
12        26424341  2018-05-01       0         3          0
13        26424341  2018-06-01      46         4          3 <-not new group
14        26424341  2018-07-01      50         5          4 <-not new group
15        26424341  2018-08-01      54         6          5 <-not new group
16        26870381  2018-01-01     465         1          1
17        26870381  2018-02-01     566         2          2
18        26870381  2018-03-01     601         3          3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...