首页 > 解决方案 > 如何根据条件分解熊猫并添加新的行和列

问题描述

我有一个这样的数据框:

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

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

它应该如下所示:

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,而 speaker_label 的值y1将变为y2。如果speaker_label在这种情况下该值没有变化,则将y311.01 处的值赋给 311,不考虑 311.99 的y值。我在 OP 中添加了这种情况。

标签: pythonpandas

解决方案


据我了解项目符号要求,您可以explodepivotreindex

  1. explode()-- < startcode>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. 使用以下方法转入ypivot_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 。我无法弄清楚为什么您的预期输出会在某些情况下放置值。


推荐阅读