为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

冉冉说 2021-10-26 18:31:53
我有一个非常大的数据框(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!
查看完整描述

2 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

计算序列开始是否有效?然后只需设置忽略值(标志4)。像这样:


sequence_starts = df.sequence == 2

sequence_ignore = df.sequence == 4

sequence_id = sequence_starts.cumsum()

sequence_id[sequence_ignore] = numpy.nan


查看完整回答
反对 回复 2021-10-26
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

我想不出比循环遍历整个事物的“愚蠢”解决方案更好的方法,例如:


import numpy as np    


counter = 0

tmp = 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] = counter

df['desired_Id_output'] = tmp

当然,这对于 20M 大小的 DataFrame 来说会很慢。改进这一点的一种方法是通过使用numba以下命令进行实时编译:


import numba


@numba.njit

def foo(sequence):

    # put in appropriate modification of the above code block

    return tmp

并用参数调用它df['sequence'].values。


查看完整回答
反对 回复 2021-10-26
  • 2 回答
  • 0 关注
  • 164 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信