Pandas 如何添加在不包括NaT的文本行组上递增的索引

Pandas 如何添加在不包括NaT的文本行组上递增的索引,pandas,increment,Pandas,Increment,我有一个数据框,它有一列代码,其中有连续的文本行,后跟连续的空值行 codes FKW FCJ XQ8 1L9 NaN NaN PNU LIT NaN 422 这组算术代码和缺失值NaN形成一个循环。我想添加一列循环索引,当下一个循环开始时,该索引是递增的。当缺失值NaN后跟代码字母数字值时,下一个循环开始 code index FKW 1 FCJ 1 XQ8 1 1L9 1 NaN 1 NaN

我有一个数据框,它有一列代码,其中有连续的文本行,后跟连续的空值行

  codes
  FKW
  FCJ
  XQ8
  1L9
  NaN
  NaN
  PNU
  LIT
  NaN
  422
这组算术代码和缺失值NaN形成一个循环。我想添加一列循环索引,当下一个循环开始时,该索引是递增的。当缺失值NaN后跟代码字母数字值时,下一个循环开始

code    index
FKW     1
FCJ     1
XQ8     1
1L9     1
NaN     1
NaN     1
PNU     2   next group starts here
LIT     2
NaN     2
422     3   next group starts here
下面是生成上述示例的代码

def id_generatorsize=3,chars=string.ascii_大写+string.digits: return.joinrandom.choicechars for uuIn rangesize 行数=10 data=np.array[rangenum\u行中i的id\u生成器] df=pd.DataFramedata,列=['code'] 测向码[4,5,8]=NaN 打印“我拥有的” printdf 打印“我想要的” df['index']=[1,1,1,1,1,2,2,2,3] printdf
如何生成索引列?

我能想到的最简单的方法是迭代数据帧的内容,并跟踪最后一个值是否为NaN

索引=[] 索引_计数器=1 last_was_NaN=错误 对于df.itertuples中的行: 如果typerow[1]为float且np.isnanrow[1]:检查索引后的第一列是否为NaN 最后一次是真的 elif last_was_NaN:如果我们现在有文本,我们可以存储它并增加计数器 last_was_NaN=错误 索引_计数器+=1 index.appendindex_计数器不要忘记添加计算出的索引 df['index']=索引 试试这个:

s = df.codes.notna()
df['index'] = (s & ~(s.shift(fill_value=False))).cumsum()

Out[718]:
  codes  index
0   FKW      1
1   FCJ      1
2   XQ8      1
3   1L9      1
4   NaN      1
5   NaN      1
6   PNU      2
7   LIT      2
8   NaN      2
9   422      3

生成索引的逻辑是什么?该数字一直运行到NaT&然后当NaT转向其他内容时,该数字会发生变化?数据中有代码行,后面是丢失的代码行。循环是一组代码和一组缺失代码。当一个代码前面有一个丢失的代码NaN时,新的循环开始。实际数据也有时间值,它包含NaT而不是NaN。我在写问题时混淆了NaN和NaT。上周我在一个样本数据集上使用ItErrors做了类似的事情。但问题是数据有数百万行,我想知道是否有更快的方法。让我检查一下你建议的运行时间。