假设我有一个Pandas框架,列为first_date、label、last_date,其中所有行的first_date < last_date。(我们称该行为z)如果行Z的first_date在同一标签的行z上方的 ANY 行的first_date和last_date之间(不只是同一个标签的正上方的一行),怎么做呢?DataFrame如下:
first_date label last_date
2023-09-11 A 2023-09-17
2023-09-11 B 2023-09-15
2023-09-20 A 2023-09-28
2023-09-17 B 2023-09-30
2023-09-30 A 2023-10-05
2023-10-03 A 2023-10-07
2023-10-05 B 2023-10-15
2023-10-19 A 2023-10-20
2023-10-10 B 2023-10-15
字符串
正确的输出应该是:
first_date label last_date
2023-09-11 A 2023-09-17
2023-09-11 B 2023-09-15
2023-09-20 A 2023-09-28
2023-09-17 B 2023-09-30
2023-09-30 A 2023-10-05
2023-10-05 B 2023-10-15
2023-10-19 A 2023-10-20
型
其中删除的行为:
2023-10-03 A 2023-10-07
2023-10-10 B 2023-10-15
型
因为标签A的2023-10-03在2023-09-30和2023-10-05之间,标签B的2023-10-10在2023-10-05和2023-10-15之间
该框架是巨大的,超过10,000行,所以应该避免循环尽可能多,提前感谢!
4条答案
按热度按时间34gzjxbg1#
我重新创建了你的dataFrame并尝试获取你的输出。我认为你可能在根据条件进行过滤之前错过了按标签对数据集进行排序。条件看起来很简单,只是不要忘记最后的按位非操作。你得到的输出只是相反的。
字符串
输出量:
型
a1o7rhls2#
不幸的是,没有有效的方法在纯Pandas中做到这一点。
但是,您可以使用
janitor
的高效conditional_join
执行左合并并识别匹配行,然后使用右索引删除它们:字符串
index
分配一个范围,而不是使用reset_index
。输出量:
型
中间体
drop
:array([5, 8])
合并中间体:
型
egmofgnx3#
我会对这个框架进行排序,然后使用Apply和一个记住最后一行处理的函数来覆盖它:
dtcbnfnu4#
字符串