Python为每个组插入连续数字

Python为每个组插入连续数字,python,pandas,Python,Pandas,我在下面有一个数据框: date ticker NATR 0 2001-02-23 ABC 9.189955 1 2001-02-23 ADP 3.300756 2 2001-02-23 AGL1 4.443902 3 2001-02-24 ALD 7.733580 4 2001-02-24 ALL 8.217828 5 2001-02-24 ALQ 2.538381 6 2001-02-24

我在下面有一个数据框:

         date ticker       NATR
0  2001-02-23    ABC   9.189955
1  2001-02-23    ADP   3.300756
2  2001-02-23   AGL1   4.443902
3  2001-02-24    ALD   7.733580
4  2001-02-24    ALL   8.217828
5  2001-02-24    ALQ   2.538381
6  2001-02-24    ALU  10.394890
7  2001-02-25    ALZ   4.970826
8  2001-02-25    AMC   4.173612
9  2001-02-25    AMP   4.012471
10 2001-02-25    ANN   8.280537
11 2001-02-26    ANZ   3.775175
12 2001-02-26    AOR   7.413381
13 2001-02-26    AQP   7.253565
14 2001-02-26    ART   4.439084
15 2001-02-26    ASX   5.089084
16 2001-02-26    AUN  51.088334
17 2001-02-27   AUT1  10.018372
18 2001-02-27    AWC   5.429162
19 2001-02-27    AWE  10.349716
我需要根据每个日期最小的“NATR”插入计分记录。每个日期的最低“NATR”得到1分,并根据每个日期列表的大小连续增加。例如:

         date ticker       NATR Points
0  2001-02-23    ABC   9.189955 3 
1  2001-02-23    ADP   3.300756 1
2  2001-02-23   AGL1   4.443902 2
3  2001-02-24    ALD   7.733580 2
4  2001-02-24    ALL   8.217828 3
5  2001-02-24    ALQ   2.538381 1
我尝试了以下代码,返回一个值错误:

df.insert(loc=3, column='points',value=np.arange(len(df.groupby('date'))))

当我删除
df.groupby('date')
时,会为数据帧的整个长度添加点,而不是为每个日期重置点。

您可以使用
cumcount

df = df.sort_values(['date', 'NATR'])
df['Points'] = df.groupby('date').cumcount() + 1
df
Out[1]: 
          date ticker              NATR  Points
1   2001-02-23    ADP          3.300756       1
2   2001-02-23   AGL1          4.443902       2
0   2001-02-23    ABC          9.189955       3
5   2001-02-24    ALQ          2.538381       1
3   2001-02-24    ALD           7.73358       2
4   2001-02-24    ALL 8.217827999999999       3
6   2001-02-24    ALU          10.39489       4
9   2001-02-25    AMP          4.012471       1
8   2001-02-25    AMC          4.173612       2
7   2001-02-25    ALZ 4.970826000000001       3
10  2001-02-25    ANN 8.280536999999999       4
11  2001-02-26    ANZ          3.775175       1
14  2001-02-26    ART 4.439083999999999       2
15  2001-02-26    ASX          5.089084       3
13  2001-02-26    AQP 7.253564999999999       4
12  2001-02-26    AOR 7.413380999999999       5
16  2001-02-26    AUN         51.088334       6
18  2001-02-27    AWC          5.429162       1
17  2001-02-27   AUT1         10.018372       2
19  2001-02-27    AWE         10.349716       3
如果您想将其重新排序,请执行
df=df.sort\u index()
。排名答案更好。

您可以使用+:


df['Points'] = df.groupby('date')['NATR'].rank(method='dense').astype(int)
          date ticker       NATR  Points
0   2001-02-23    ABC   9.189955       3
1   2001-02-23    ADP   3.300756       1
2   2001-02-23   AGL1   4.443902       2
3   2001-02-24    ALD   7.733580       2
4   2001-02-24    ALL   8.217828       3
5   2001-02-24    ALQ   2.538381       1
6   2001-02-24    ALU  10.394890       4
7   2001-02-25    ALZ   4.970826       3
8   2001-02-25    AMC   4.173612       2
9   2001-02-25    AMP   4.012471       1
10  2001-02-25    ANN   8.280537       4
11  2001-02-26    ANZ   3.775175       1
12  2001-02-26    AOR   7.413381       5
13  2001-02-26    AQP   7.253565       4
14  2001-02-26    ART   4.439084       2
15  2001-02-26    ASX   5.089084       3
16  2001-02-26    AUN  51.088334       6
17  2001-02-27   AUT1  10.018372       2
18  2001-02-27    AWC   5.429162       1
19  2001-02-27    AWE  10.349716       3