首页 > 解决方案 > 如何选择在 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

我想只保留taken1by的行,如果列中id有两个(或更多)consequent只保留其中的第一个。1taken

我的输出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

关于如何做到这一点的任何想法?

标签: pythonpython-3.xpandas

解决方案


通过按 分组创建布尔掩码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

推荐阅读