pandas - 只保留一个值的第一次出现,直到它更改为另一个值
问题描述
我的数据集如下所示:
id mz_id time duration
1 a 0:00 0:10
1 a 0:01 0:10
1 a 0:05 0:10
1 a 0:07 0:10
1 a 0:09 0:10
1 b 5:10 1:10
1 b 15:10 1:10
1 b 35:10 1:10
1 a 1:10:05 0:15
1 a 1:20:07 0:15
1 b 2:10:05 1:10
1 c 3:20:07 0:15
等等..
我想保持值 mz_id 的首次出现,如下所示:
id mz_id time duration
1 a 0:00 0:10
1 b 5:10 1:10
1 a 1:10:05 0:15
1 b 2:10:05 1:10
1 c 3:20:07 0:15
这对 mz_id 和 duration 不是唯一的,我不知道在这种情况下如何删除它们......我删除重复项应该只基于 - 始终保持 mz_id 的第一个外观,直到它改变。
解决方案
IIUC,使用辅助系列和groupby+first
:
df.groupby(df['mz_id'].ne(df['mz_id'].shift()).cumsum()).first().reset_index(drop=True)
id mz_id time duration
0 1 a 0:00 0:10
1 1 b 5:10 1:10
2 1 a 1:10:05 0:15
3 1 b 2:10:05 1:10
4 1 c 3:20:07 0:15
详细信息:检查下一行是否与当前行相同,然后执行 acumsum()
为每个更改的组分配一个组,然后按该系列分组并首先返回
df['mz_id'].ne(df['mz_id'].shift())
0 True
1 False
2 False
3 False
4 False
5 True
6 False
7 False
8 True
9 False
10 True
11 True
因此,对于在下一行中具有相同值的所有第一行,这将返回 true。
但是,正如@Datanovice 指出的那样,在您的示例中,由于您只是占据第一行,因此下面的内容也可以使用。
df[df['mz_id'].ne(df['mz_id'].shift())]
推荐阅读
- php - 在 Laravel 中,公共路径和存储路径有什么区别?
- sql - 我有一个带有参数的 SQL Server 2012 sql 查询:@Region 有一个 WHERE 子句,我想根据 @Region 值设置它的值
- ios - 在 Swift 中选择 Continue 按钮时检查表视图中的空行
- scala - 如何断言错误类型中的单个字段?
- java - 如何在 power shell 中调用 java 类
- python - 用 pandas 训练 apriori 数据集不显示结果
- excel - 收件人无法在 Outlook 电子邮件中看到图像
- r - 尝试通过模拟点模式模拟.mppm 会导致错误
- javascript - 带有重定向路由的Vue-Router无限循环
- java - 如何通过Java中的给定位置打印矩阵的垂直和水平线?