有没有一种方法可以获取一个组的最后一个项目?

6
假设我有一个 DataFrame 数据框:
data = {'Column 1':     [ 1, 1, 2, 2, 2, 3, 4, 4, 4, 4], 
        'Column 2':     [ 1, 2, 1, 2, 3, 1, 1, 2, 3, 4], 
        'Column 3':     [ 1, 2, 1, 4, 3, 6, 1, 2, 7, 5]}

df = pd.DataFrame(data=data)

我想获取第2、5、6和10行,因为这些行是第1列中每个值的最后一行。假设第1列是一个ID,第2列表示该ID的数量。我需要选择第1列中每个数字的最大数字,并保留第2列和第3列成对的内容而不更改它们。

所以我从以下内容开始:

1  1  1
1  2  2
2  1  1
2  2  4
2  3  3
3  1  6
4  1  1
4  2  2
4  3  7
4  4  5

to

1  2  2
2  3  3
3  1  6
4  4  5

如果我执行

df.groupby(['Column 1']).max()

我得不到我想要的,因为它会使第二列和第三列都达到最大值。

4个回答

7

groupby/tail

df.groupby('Column 1').tail(1)

   Column 1  Column 2  Column 3
1         1         2         2
4         2         3         3
5         3         1         6
9         4         4         5

4

使用 Groupby.nth

In [198]: df.groupby('Column 1', as_index=False).nth([-1])    
Out[198]: 
   Column 1  Column 2  Column 3
1         1         2         2
4         2         3         3
5         3         1         6
9         4         4         5

4

使用drop_duplicates函数

df_final = df.drop_duplicates('Column 1', keep='last')

Out[9]:
   Column 1  Column 2  Column 3
1         1         2         2
4         2         3         3
5         3         1         6
9         4         4         5

1
如果您的数据框已经排序,我们就不需要使用groupby,可以使用布尔索引Series.shift进行操作。
df_filtered = df.loc[~df['Column 2'].lt(df['Column 2'].shift(-1))]
print(df_filtered)
   Column 1  Column 2  Column 3
1         1         2         2
4         2         3         3
5         3         1         6
9         4         4         5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接