Python 在数据框中保留最新的记录组

Python 在数据框中保留最新的记录组,python,pandas,dataframe,Python,Pandas,Dataframe,我正在尝试清理一些数据,如果这些数据多次出现,我只需要保留其中的最新数据,但所有数据都需要保留。让我困惑的是,这些数据实际上是分组组织的。我在下面有一个dataframe示例,以及可能更清楚的注释: method year proteins values 0 John 2017 A 10 1 John 2017 B 20 2 John 2018 A 30 # John's m

我正在尝试清理一些数据,如果这些数据多次出现,我只需要保留其中的最新数据,但所有数据都需要保留。让我困惑的是,这些数据实际上是分组组织的。我在下面有一个dataframe示例,以及可能更清楚的注释:

     method  year proteins  values
0      John  2017        A      10
1      John  2017        B      20
2      John  2018        A      30 # John's method in 2018 is most recent, keep this line and drop index 0 and1
3      Kate  2018        B      11
4      Kate  2018        C      22 # Kate's method appears only in 2018 so keep both lines (index 3 and 4)
5   Patrick  2017        A      90
6   Patrick  2018        A      80
7   Patrick  2018        B      85
8   Patrick  2018        C      70
9   Patrick  2019        A      60
10  Patrick  2019        C      50 # Patrick's method in 2019 is the most recent of Patrick's so keep index 9 and 10 only
因此,所需的输出数据框与测量的蛋白质无关,但应包括所有测量的蛋白质:

     method  year proteins  values
0      John  2018        A      30
1      Kate  2018        B      11
2      Kate  2018        C      22
3   Patrick  2019        A      60
4   Patrick  2019        C      50
希望这是清楚的。我尝试过类似这样的方法,my_df.sort_values'year'。drop_duplicates'method',keep='last',但它给出了错误的输出。有什么想法吗?谢谢大家!

PS:要复制我的初始df,您可以复制以下行:


因为重复项是必需的,请与max一起使用,并按原始列“年份”与进行比较,以便进行相等和筛选:


因为重复项是必需的,请与max一起使用,并按原始列“年份”与进行比较,以便进行相等和筛选:


不需要PS来复制数据帧-我们可以使用pd.read_剪贴板。不需要PS来复制数据帧-我们可以使用pd.read_剪贴板。谢谢!你的答案总是值得深思的,它们带来了一些我以前从未遇到过或通过任何课程学到的东西。需要致力于这一转变并理解这一点。谢谢!你的答案总是值得深思的,它们带来了一些我以前从未遇到过或通过任何课程学到的东西。需要致力于这一转变并理解这一点。
import pandas as pd
import numpy as np

methodology=["John", "John", "John", "Kate", "Kate", "Patrick", "Patrick", "Patrick", "Patrick", "Patrick", "Patrick"]
year_pract=[2017, 2017, 2018, 2018, 2018, 2017, 2018, 2018, 2018, 2019, 2019]
proteins=['A', 'B', 'A', 'B', 'C', 'A', 'A', 'B', 'C', 'A', 'C']
values=[10, 20, 30, 11, 22, 90, 80, 85, 70, 60, 50]
my_df=pd.DataFrame(zip(methodology,year,proteins,values), columns=['method','year','proteins','values'])

my_df['year']=my_df['year'].astype(str)
my_df['year']=pd.to_datetime(my_df['year'], format='%Y') # the format never works for me and this is why I add the line below
my_df['year']=my_df['year'].dt.year
df = my_df[my_df['year'].eq(my_df.groupby('method')['year'].transform('max'))]
print (df)

       method  year proteins  values
2        John  2018        A      30
3        Kate  2018        B      11
4        Kate  2018        C      22
9   Patrick's  2019        A      60
10  Patrick's  2019        C      50