Python Pandas:在 df 列中使用“标志值”创建连续的 id 值并将其显示在另一列中

我有一个非常大的数据框(20.000.000+ 行),其中包含一个名为“序列”的列。


“序列”列是根据应用一些条件语句的时间序列计算得出的。值“2”标记序列的开始,值“3”标记序列的结束,值“1”标记序列内的数据点,值“4”标记需要忽略的数据点。(注意:标志值不一定必须是 1、2、3、4)


我想要实现的是一个连续的 ID 值(写在一个单独的列中 - 请参阅下面示例中的“desired_Id_Output”),它以独特的方式标记 2 - 3 的序列切片(序列的长度可变,范围从2 [仅开始+结束] 到 5000 多个数据点),以便能够对各个序列进行进一步的分组计算。


index  sequence    desired_Id_Output    

0          2                  1                   

1          1                  1                   

2          1                  1                   

3          1                  1                   

4          1                  1                   

5          3                  1                   

6          2                  2                   

7          1                  2                   

8          1                  2                   

9          3                  2                   

10         4                  NaN                   

11         4                  NaN                   

12         2                  3                   

13         3                  3                   

提前致谢,BR!


冉冉说
浏览 168回答 2
2回答

九州编程

计算序列开始是否有效?然后只需设置忽略值(标志4)。像这样:sequence_starts = df.sequence == 2sequence_ignore = df.sequence == 4sequence_id = sequence_starts.cumsum()sequence_id[sequence_ignore] = numpy.nan

肥皂起泡泡

我想不出比循环遍历整个事物的“愚蠢”解决方案更好的方法,例如:import numpy as np    counter = 0tmp = np.empty_like(df['sequence'].values, dtype=np.float)for i in range(len(tmp)):    if df['sequence'][i] == 4:        tmp[i] = np.nan    else:        if df['sequence'][i] == 2:            counter += 1        tmp[i] = counterdf['desired_Id_output'] = tmp当然,这对于 20M 大小的 DataFrame 来说会很慢。改进这一点的一种方法是通过使用numba以下命令进行实时编译:import numba@numba.njitdef foo(sequence):    # put in appropriate modification of the above code block    return tmp并用参数调用它df['sequence'].values。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python