python - 如何选择在 pandas 中使用 groupby 第一次出现值的行,以及随后出现的第一个值

标签 python python-3.x pandas

我有一个如下所示的数据框:

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 已经是关于 idtime 的顺序。

我只想保留 takenid 值为 1 的行,如果有两个(或更多)结果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 分组创建 bool 掩码,然后取 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

关于python - 如何选择在 pandas 中使用 groupby 第一次出现值的行,以及随后出现的第一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60251666/

相关文章:

python - PyMongo/MongoDB - 起点和终点 LatLon 的地理空间查询

python - 如何停止对字符串列表中重复字母的过度计数

python - 根据 groupby 值从 Pandas 数据框中删除行

python - 在 pandas 数据框中,根据其他两列的结果生成第三列数据

python - 如何在 Python 中访问父类(super class)的类属性?

python - 使用新参数安排python脚本重新启动或对象重新初始化

python - 在 asyncio 中测试一个永远运行的任务

Python Pandas : Merge Equivalent of "<=" SQL Join

python-3.x - 如何在 python 订阅者中捕获 google.auth.exceptions.RefreshError?

c# - 如何将 python 数据结构返回给 C#