如何爆炸熊猫并根据条件添加新的行和列

康纳449

我有一个这样的数据框:

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

我想以几种方式转换这个数据框:

  • 将每一行转换为代表 1 秒。startstop表示事件发生的时间(以秒为单位)。我想爆炸它,以便每秒获得 1 行。将浮点数转换为 int 时,我想四舍五入。
  • 我想创建 2 个新的 columsn, y1and y2,它们来自speaker_labely之间的交叉如果speaker_label15y,则y1该行的列是 5。
  • 如果有几行不在一个start stop范围内的秒数,因此没有speaker_labely数据,那么我希望这些值是 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_label1值将变为 ,而 2 的扬声器标签y1值将变为y2如果speaker_label在这种情况下值没有变化,则将y311.01 处分配给 311,而不考虑 311.99y值。我将此情况添加到OP中。

tdy

按照我的理解子弹的要求,你可以explodepivotreindex

  1. 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
  1. 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
  1. 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章