Pandas 基于数据集中以前的数字的数据帧编号

Pandas 基于数据集中以前的数字的数据帧编号,pandas,numpy,Pandas,Numpy,我事先表示歉意,我不知道如何将空值添加到pandas数据帧中,因此我在列表中放置了“无”。我有一个具有以下值的数据帧: None, None, 50,60,70,80,90,None,None, None, 110, None, None import pandas as pd number_list = [None, None, 50,60,70,80,90, None, 100, None, None, None, 110, None, None] df = pd.DataFrame(nu

我事先表示歉意,我不知道如何将空值添加到pandas数据帧中,因此我在列表中放置了“无”。我有一个具有以下值的数据帧:

None, None, 50,60,70,80,90,None,None, None, 110, None, None

import pandas as pd
number_list = [None, None, 50,60,70,80,90, None, 100, None, None, None, 110, None, None]
df = pd.DataFrame(number_list, columns=['ID'])
有None的需要根据前面的编号分配编号。因此,如果空白值前的数字为90,则空白数字将被分配为91(前面的数字+ 1)。如果None位于行的开头,则编号将以99901开始,以此类推

 the final result for this example would be: 
 99901, 99902, 50,60,70,80,90,91,92,93,110,111,112
我尝试在t-sql中执行此操作,但每批处理需要3分钟以上。我有几千批。。。只要方向正确,我们将不胜感激!!谢谢

IIUC

# getting the group key df.ID.isnull().astype(int).diff().ne(0).cumsum()  
s=df.groupby(df.ID.isnull().astype(int).diff().ne(0).cumsum()).cumcount().add(1)[df.ID.isnull()]
df.fillna((df.ffill().fillna(90000)).add(s,0))
Out[193]:
         ID
0   90001.0
1   90002.0
2      50.0
3      60.0
4      70.0
5      80.0
6      90.0
7      91.0
8     100.0
9     101.0
10    102.0
11    103.0
12    110.0
13    111.0
14    112.0

非常感谢你!这正如预期的那样奏效。你介意解释一下它是如何工作的吗?@yanci首先,我们填充并填充na()以实现第一步,然后,第二步,我们通过将df拆分为2部分isnull和notnull来处理增量,然后我们计算连续的行数如果我想按10而不是1添加,我会改为.add(10)吗?我改变了第一行,它工作得很好,但是没有进程号的第一个数字仍然是按one@yanci应该是这样。穆(10)再次感谢。我还有一个问题要问你。那些没有进程号的,我需要从990开始,然后反向工作。所以不是90002和90001,而是980990。这个数字不可能超过1000,这就是为什么它从990开始,然后从那里倒退。因此,如果一开始我有5个空插槽,它将是95096097090990。这仅适用于没有程序编号的第一批记录。再次感谢你的帮助!