我有这样一个数据帧:
NoDemande NoUsager Sens IdVehiculeUtilise Fait HeurePrevue HeureDebutTrajet
0 42191000823 001208 + 246Véh 1 08:20:04 08:22:26
1 42191000822 001208 + 246Véh 1 08:20:04 08:18:56
2 42191000822 001208 - 246Véh -99 09:05:03 08:56:26
3 42191000823 001208 - 246Véh 1 09:05:03 08:56:26
4 42191000834 001208 + 246Véh 1 16:50:04 16:39:26
5 42191000834 001208 - 246Véh 1 17:45:03 17:25:10
6 42192000761 001208 + 246Véh -1 08:20:04 08:15:07
7 42192000762 001208 + 246Véh 1 08:20:04 08:18:27
8 42192000762 001208 - 246Véh -99 09:05:03 08:58:29
9 42192000761 001208 - 246Véh -11 09:05:03 08:58:29
我从df[df.duplicated(['NoUsager','NoDemande'],keep=False)]
获得这个数据帧,这确保了我的行是成对的。当NoDemande
是连续数时,我想删除一对行(比如42191000822和42191000823,42192000761和42192000762),列{Fait
列中保存一个更多的正数(至少有一个大于0)
所以我的结果应该是:
^{pr2}$我知道这是关于OR
逻辑的,但我不知道如何实现它。在
~
我在这里看到两种解决方案。 第一种方法基于这样一种建议,即在数据集中始终有连续的条目对,即如果任何条目有一对条目,则该对位于该条目之后。然后,您应该循环使用步长为2的数据帧:
在这个循环中,你可以比较你的两个条目,去掉一个负值。在
我的第二个建议有点复杂。
首先,您应该复制并延迟(按特定行数移动)所有列。这可以通过以下函数实现(仅适用于NoDemande,对于每一列都使用循环):
^{pr2}$它看起来像:
然后比较NoDemande和NoDemande_lagged列中同一行中的两个值。如果42191000822中的数字比NoDemande中的值大或小1,则比较Fait和Fait\u lagged并选择更正的值,将其粘贴到新的列Fait\u selected。您应该对其他列执行相同的操作,以便每个列都有一个滞后副本和一个选定副本。之后,您应该删除下一行,因为您已经将它与前一行进行了比较。 最后,您应该删除原始列和滞后列,只保留“\u selected”。在
很抱歉给你一个复杂的解释,希望这对你有帮助。如果你熟悉RapidMiner,我可以在那里解释如何做,这样会更容易。我给了你一些关于各种概念的想法,可以帮助你解决你的问题。在
这是一个冗长的解决方案,可能还有较短的解决方案。
frame0
正是您在上面发布的框架。在{2>把第一行的数据分成两行,然后重新组合。使事情更简单:
接下来进行一些比较,看看在给定行中,该行上面的行是否重复:
^{pr2}$现在检查
Fait
的值:迭代所有行并使用布尔值
lastColumnsPartner
创建一个新索引,该索引标识重复行:只取
Fait
(FaitBool
)中至少有一个正值的行,按Fait
(FaitPos
)的正数排序,删除重复项(newIndex
),只保留Fait
的最大值,然后返回NoDemande
。在最后在初始帧上使用布尔索引过滤所有内容。在
我不能确定它是否适用于所有的情况,它适用于你的例子。此外,可能还有改进的余地。在
我处理这个问题的方法是生成两列,其中包含检查的条件(相同的heure和连续递增的NoDemande)。然后迭代数据帧,根据Fait列删除不需要的对。在
这是一个有点骇人听闻的代码,但这似乎能做到:
结果:
^{pr2}$相关问题 更多 >
编程相关推荐