python - 如何根据条件分解熊猫并添加新的行和列
问题描述
我有一个这样的数据框:
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 秒。
start
并stop
表示事件发生的时间(以秒为单位)。我想爆炸这个,以便我每秒得到 1 行。将浮点数转换为 int 时,我想四舍五入。 - 我想创建 2 个新列
y1
和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,而 speaker_label 的值y1
将变为y2
。如果speaker_label
在这种情况下该值没有变化,则将y
311.01 处的值赋给 311,不考虑 311.99 的y
值。我在 OP 中添加了这种情况。
解决方案
据我了解项目符号要求,您可以explode
、pivot
和reindex
:
explode()
-- <start
code>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 。我无法弄清楚为什么您的预期输出会在某些情况下放置值。
推荐阅读
- python - 使用数据框列作为带有 matplotlib 的图形线的颜色
- node.js - 带有 Express 泄漏内存的 Node JS
- javascript - 以下代码行的输出是什么?变量 x = 空;var z = "sp"; 如果 (x==true){ z+=1; } 控制台.log(z); *
- swift - 每当更新变量时如何重新触发函数
- django - 在多个数据库django中实现行级权限
- javascript - 由于 eventListeners 导致网站崩溃;TypeError:无法读取 null 的属性“setAttribute”
- excel - 仅在活动选项卡上设置更新日期
- php - PHP Basic SQL INSERT INTO 致命错误 1048
- html - 当我点击另一个页面时,导航栏会改变大小
- html - `readonly` `input` 是否被视为交互式内容?