同样,我还有一个与此有关的问题:我正在处理一个DataFrame,它看起来如下:
问题是,现在我想添加一个名为“ 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才能重新开始计数的条件。
答案 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