我有数据框:
one N th
0 A 5 1
1 Z 17 0
2 A 16 0
3 B 9 1
4 B 17 0
5 B 117 1
6 XC 35 1
7 C 85 0
8 Ce 965 1
我正在寻找在第三列中不断交替出现 0101 而不将 0 或 1 加倍的方法。因此,如果在第 列有两个重复的 0,我想删除具有最小值的行,如果有重复的 1,我想删除具有最大值的行。
我的基础由 1000000 行组成。
我希望有这样的数据框:
one N th
0 A 5 1
1 Z 17 0
3 B 9 1
4 B 17 0
6 XC 35 1
7 C 85 0
8 Ce 965 1
最快的方法是什么?我的意思是矢量化方法。我尝试过,但没有结果。
使用自定义
groupby.idxmax
如果“th”为,则可以交换符号
1
(以获取最大值而不是最小值),然后设置自定义分组器(使用diff
或shift
+cumsum
)并执行以选择要保留的groupby.idxmax
行:使用不同的方法来交换符号并计算组:
输出:
中间体:
使用布尔掩码
上述代码适用于任意数量的连续 0 或 1。如果你知道最多只有 2 个连续的 1,那么你也可以使用布尔索引,这应该会快得多:
输出:
中间体:
具有相等值的更复杂示例:
注意:在相等的情况下,可以选择第一行/第二行或两者或都不选择,具体取决于所使用的运算符(,,,,
D.le(0)
)。D.lt(0)
D.gt(0)
D.ge(0)
时间安排
尽管最多只能有 2 个连续的“th”,但布尔掩码方法的速度要快 4-5 倍。对 1M 行进行计时:
如果您不想创建中间列,则可以使用一个版本:
创建一个变量不是很容易吗?然后在循环中将其设置为第一个,然后将其与下一个进行比较。如果相同,并且为 0,则删除最低的;如果为 1,则删除最高的。如果它们不同,则将变量设置为下一个并继续循环
由于其中一条评论而添加此项。关于下面描述的迭代方法,它实际上并不是您想要使用的技术,因为它没有利用 Pandas。添加它是为了完整性,因为如果与其他解决方案相比,它不太简洁。
您想要的是以下两种情况之间的“或”关系:
代码 :