python 中的事件开始到热编码

event start-end into hot encoding in python

我有一个包含 2 列 "type" 和 "sign" 的 pandas 数据框,如下所示

    type    sign
0   open    A
1   open    B
2   open    D
3   close   B
4   close   D
5   open    B
6   close   B
7   close   A

"A" + "open" 表示事件 A 已经开始发生。 "A" + "close" 表示事件A已经停止。 当时间是一个主要问题时,我需要对其进行矢量化(该列表实际上大约有 4000 万行)。 有点像单热编码,但当且仅当事件为 "active" 时,我才需要“1”存在。 例如,对于这种情况,结果应该是:

    A   B   C   D   type    sign
0   1   0   0   0   open    A
1   1   1   0   0   open    B
2   1   1   0   1   open    D
3   1   0   0   1   close   B
4   1   0   0   0   close   D
5   1   1   0   0   open    B
6   1   0   0   0   close   B
7   0   0   0   0   close   A

想法? 谢谢

IIUC 先做 get_dummies 再做 cumsum

s=df.sign.str.get_dummies().reindex(columns=list('ABCD'),fill_value=0).\
    mul(df.type.map({'open':1,'close':-1}),axis=0).cumsum()
   A  B  C  D
0  1  0  0  0
1  1  1  0  0
2  1  1  0  1
3  1  0  0  1
4  1  0  0  0
5  1  1  0  0
6  1  0  0  0
7  0  0  0  0
df=df.join(s)

对于你的数据,你可以做一个for循环:

for sign in 'ABCD':
    df[sign] = (df['type'].where(df['sign'].eq(sign))
                 .ffill()
                 .eq('open')
                 .astype(int)
               )   

输出:

    type sign  A  B  C  D
0   open    A  1  0  0  0
1   open    B  1  1  0  0
2   open    D  1  1  0  1
3  close    B  1  0  0  1
4  close    D  1  0  0  0
5   open    B  1  1  0  0
6  close    B  1  0  0  0
7  close    A  0  0  0  0