计算满足条件的行数,并为每行分配一个从1到nRows熊猫的数字

时间:2018-12-07 10:57:41

标签: python pandas dataframe pandas-groupby

同样,我还有一个与此有关的问题:我正在处理一个DataFrame,它看起来如下:

enter image description here

问题是,现在我想添加一个名为“ position”的附加列,其中,根据contributor_id和编辑次数,将显示相应行的数目。问题是,现在,我不希望重新启动行数,直到nEdits中的值大于0,并且当contributor_id更改时,此数字必须重新初始化为1:

    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 :(得分:0)

使用contributor_id列的this answer和助手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