python - 将第一行和最后一行保留在 Pandas 中存在子字符串的组中的最佳方法
问题描述
我有以下格式的 DataFrame
Event | Start Time | ID
Type 1 - A 2020-02-03 1
Type 1 - B 2020-02-04 1
Type 2 - A 2020-02-05 1
Type 1 - C 2020-02-06 1
Type 2 - B 2020-02-07 1
Type 2 - C 2020-02-08 1
Type 1 - D 2020-02-09 1
Type 1 - A 2020-02-03 2
.... .... ....
我想保留“类型 1”的所有事件,但在按 ID 分组时只包括“类型 2”的第一个和最后一个事件。
因此,对于 ID 1,我希望输出为
Event | Start Time | ID
Type 1 - A 2020-02-03 1
Type 1 - B 2020-02-04 1
Type 2 - A 2020-02-05 1
Type 1 - C 2020-02-06 1
Type 2 - C 2020-02-08 1
Type 1 - D 2020-02-09 1
Type 1 - A 2020-02-03 2
.... .... ....
实现这一目标的最佳方法是什么?
解决方案
想法是通过创建掩码Series.str.startswith
,将不匹配的值替换为NaN
s 通过Series.where
,然后通过按位Series.duplicated
链接获取第一个和最后一个值,对于不匹配的行,通过原始反转掩码获取第一个和最后一个值:|
OR
mask
mask = df['Event'].str.startswith('Type 2')
s = df['ID'].where(mask)
df1 = df[~s.duplicated() | ~s.duplicated(keep='last') | ~mask]
print (df1)
Event Start Time ID
0 Type 1 - A 2020-02-03 1
1 Type 1 - B 2020-02-04 1
2 Type 2 - A 2020-02-05 1
3 Type 1 - C 2020-02-06 1
5 Type 2 - C 2020-02-08 1
6 Type 1 - D 2020-02-09 1
7 Type 1 - A 2020-02-03 2
推荐阅读
- ruby-on-rails - 创建了 POST 路由,但导致 RoutingError(No Route 与 POST 匹配)
- html - 包含主导航的侧边栏的 ARIA 里程碑角色
- mongodb - 监视 Mongo db 的 Bash 脚本不起作用
- html - 我怎样才能摆脱顶部多余的空白?
- javascript - 如何在 Angular 中对嵌套的订阅方法进行单元测试?
- python - df.sort_values 不是排序表(python/pandas)
- java - 如何调试 jbehave 故事运行的 selenium 远程 Web 驱动程序?
- c++ - 迷宫求解程序的回溯逻辑错误
- javascript - ng-circle-progress 组件仅在属性 renderOnClick 属性设置为 true 时有效
- postgresql - 检索具有给定列表中不存在的列值的行