我有一个这样的数据框:
start stop speaker_label y
309.16 309.58 2 5
312.01 312.59 2 5
313.4 313.59 1 4
314.35 314.92 2 4
316.96 317.27 1 5
319.36 319.89 1 5
322.01 323.10 2 7
我想以几种方式转换这个数据框:
start
并stop
表示事件发生的时间(以秒为单位)。我想爆炸它,以便每秒获得 1 行。将浮点数转换为 int 时,我想四舍五入。y1
and y2
,它们来自speaker_label
和y
列之间的交叉。如果speaker_label
15
在y
,则y1
该行的列是 5。start
stop
范围内的秒数,因此没有speaker_label
或y
数据,那么我希望这些值是 NaN。它应该是这样的:
time y1 y2
309 NaN 5
310 NaN 5
311 NaN 5
312 NaN 5
313 4 NaN
314 NaN 4
315 NaN 4
316 5 NaN
317 5 NaN
318 5 NaN
319 5 NaN
320 NaN NaN
321 NaN NaN
322 NaN 7
323 NaN 7
如果该speaker_label
值发生变化(311.01 为 1,311.99 为 2),则speaker_label
1的值将变为 ,而 2 的扬声器标签y1
值将变为y2
。如果speaker_label
在这种情况下该值没有变化,则将y
311.01 处的值分配给 311,而不考虑 311.99y
值。我将此情况添加到OP中。
按照我的理解子弹的要求,你可以explode
,pivot
和reindex
:
explode()
在start
-stop
间隔成time
排:df['time'] = df.apply(lambda x: range(int(x.start), 1+int(x.stop)), axis=1)
df = df.explode('time').drop(columns=['start', 'stop']).set_index('time')
# speaker_label y
# time
# 309 2 5
# 312 2 5
# 313 1 4
# 314 2 4
# 316 1 5
# 317 1 5
# 319 1 5
# 322 2 7
# 323 2 7
y
使用pivot_table()
以下方法转入列:df = df.pivot_table(index='time', columns='speaker_label')
# y
# 1 2
# time
# 309 NaN 5.0
# 312 NaN 5.0
# 313 4.0 NaN
# 314 NaN 4.0
# 316 5.0 NaN
# 317 5.0 NaN
# 319 5.0 NaN
# 322 NaN 7.0
# 323 NaN 7.0
reindex()
缺少的time
步骤:df = df.reindex(range(df.index.min(), 1+df.index.max()))
# y
# 1 2
# time
# 309 NaN 5.0
# 310 NaN NaN
# 311 NaN NaN
# 312 NaN 5.0
# 313 4.0 NaN
# 314 NaN 4.0
# 315 NaN NaN
# 316 5.0 NaN
# 317 5.0 NaN
# 318 NaN NaN
# 319 5.0 NaN
# 320 NaN NaN
# 321 NaN NaN
# 322 NaN 7.0
# 323 NaN 7.0
请注意,这与您的预期输出不完全匹配,但这就是我解释项目符号要求的方式。当两者都不speaker_label
活跃时,此方法将放置 NaN 。我无法弄清楚为什么您的预期输出会在其中一些情况下放置值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句