python - 如何选择在 Pandas 中使用 groupby 首次出现值的行以及随后出现的第一次
问题描述
我有一个看起来像这样的数据框:
import pandas as pd
df = pd.DataFrame({'id': [1,1,1,1,1,2,2,2,2], 'time': [1,2,3,4,5,4,7,8,9], 'taken': [0,1,1,0,1,0,1,0,1]})
这df
已经是关于id
&的命令time
。
我想只保留taken
值1
by的行,如果列中id
有两个(或更多)consequent只保留其中的第一个。1
taken
我的输出df
应该是这样的:
id time taken
1 1 2 1
4 1 5 1
6 2 7 1
8 2 9 1
第二个例子
为了让问题更清楚一点,如果数据框看起来像这样:
df = pd.DataFrame({'id': [1,1,1,1,1,2,2,2,2], 'time': [1,2,3,4,5,4,7,8,9], 'taken': [0,1,1,1,1,1,1,0,1]})
然后输出数据框应该如下所示:
id time taken
1 1 2 1
5 2 4 1
8 2 9 1
关于如何做到这一点的任何想法?
解决方案
通过按 分组创建布尔掩码id
,然后取值taken
为 True 但其移位值不为 True 的值。
df1 = pd.DataFrame({'id': [1,1,1,1,1,2,2,2,2], 'time': [1,2,3,4,5,4,7,8,9], 'taken': [0,1,1,0,1,0,1,0,1]})
df2 = pd.DataFrame({'id': [1,1,1,1,1,2,2,2,2], 'time': [1,2,3,4,5,4,7,8,9], 'taken': [0,1,1,1,1,1,1,0,1]})
df = df1 # First example.
>>> df[df.groupby('id')['taken'].shift().ne(True) & df['taken']]
id time taken
1 1 2 1
4 1 5 1
6 2 7 1
8 2 9 1
df = df2 # Second example.
>>> df[df.groupby('id')['taken'].shift().ne(True) & df['taken']]
id time taken
1 1 2 1
5 2 4 1
8 2 9 1
推荐阅读
- java - 以响应式方式使用分页 API
- selenium - Docker:Selenium Hub 和 [SEVERE] 的 Chrome 节点错误:bind() 失败:无法分配请求的地址 (99)
- oracle - 如何根据表的值添加别名
- android - 如何在通过 RobotFramework 和 Appium 触发我的 react-native 应用程序时修复 MainActivity 的超时
- javascript - async await Promise resolve 是否需要调用 .then() ?
- c - 是否有任何理由来寻址数组,例如
[大批]? - r - R中的K聚类不返回预期值
- javascript - 如何使用当前状态进行推送
- linux - curl 正在从 gitlab 下载 html 而不是实际的 zip 文件
- javascript - Angular7 等效于 C# 属性装饰器