我有一个如下所示的数据框:
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
的 id
值为 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/