【发布时间】:2017-04-27 15:17:52
【问题描述】:
我有以下数据框:
id sub_id timestamp dist time_dif speed status
1 1 1 2016-07-01 00:01:00 20 00:01:00 0.0075 True
2 1 1 2016-07-01 00:01:59 29 00:00:59 0.3450 True
3 1 1 2016-07-01 00:03:00 30 00:01:00 0.0987 True
4 1 2 2016-07-01 00:03:59 21 00:59:00 0.5319 True
5 1 2 2016-07-01 00:05:00 40 00:01:00 0.0076 False
在上面的数据框中,status = False,只要距离>30。
我想对创建函数或方式提出建议,以便每当状态为“false”时,这意味着距离 > 30,(在上述数据框中,第 5 行)我可以执行以下操作:
处理 status = False (ROW 5) 的行
第 5 行“dist”下的值(其中 status = False,dist = 40)变为 30,因为 30 是阈值距离,不能超过 30。 所以,40 - 30 = 10,这额外的 10 应该移到下一行。
“状态”变为“真”(因为 dist = 30)
“速度”保持不变,
“id”、“sub_id”保持不变
“time_diff”有一个新值,因为我们在第5行有速度和距离,所以可以计算时间
“timestamp”也应该改变,如果我们计算time_diff,我们可以将time_diff添加到第4行的“time”的值上,得到第5行的新时间戳。
处理下一行 (ROW 6)
现在,只要 dist >30 / status = False,就应该在数据框中插入第 6 行或下一行,这样前一行中的任何额外距离都会进入这个新行。
在上面的示例中,第 6 行下的“dist”的值为 (40-30),即 10。
“id”保持不变,
“sub_id”变成3(加1),
由于 10 现在小于 30,“状态”应该为真。
“速度”保持不变。
“time_diff”将再次使用第 6 行中的“dist”和“speed”值进行计算。
“timestamp”也将被计算,通过将“time_diff”添加到前一行“timestamp”的值
虽然数据框中的其余行照常跟随,直到遇到另一行 status = False。
另外,可能存在“dist” = 70的情况,所以在这种情况下,dist = 70的行应该有dist = 30,那么下一行应该有dist = 40,仍然大于30,所以它应该只保留 30 个,并将剩余的 10 个插入下一行。
如果有任何不清楚的地方,请告诉我。 提前致谢。
【问题讨论】:
-
为了确保我理解正确,当发生更改时,您还会覆盖现有行吗?
-
@AsheKetchum 是的,status= False 的行将被新值覆盖。此外,以下是新行的创建,该行将具有“dist”下的剩余距离和相应的值。
-
存在
iterrows()和itertuples()可以让您遍历数据框,然后您可以使用df.loc[nextRowsIndex]==newRow创建新行。 -
另外,当您创建一个新行时,您是否希望它直接位于创建它的行的下方?假设你有
[true, false, true, true],false的分离组件会插入第三行吗?还是会在最后附加? -
@AsheKetchum 是的,就是这样,它应该在该行的正下方。并且新行应该增加了“sub_id”。