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做了类似的事情。但问题是数据有数百万行,我想知道是否有更快的方法。让我检查一下你建议的运行时间。