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
我有一个包含 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