Храните самые последние GROUPR записей в кадре данных - PullRequest
1 голос
/ 21 марта 2020

Я пытаюсь очистить некоторые данные, из которых мне нужно сохранить только самые последние, но все из них, если они появляются более одного раза. Что меня смущает, так это то, что данные на самом деле организованы в «группы». Ниже у меня есть пример информационного кадра вместе с комментариями, которые могут сделать его более понятным:

     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, вы можете скопировать следующие строки:

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

1 Ответ

3 голосов
/ 21 марта 2020

Поскольку дубликаты необходимы, используйте GroupBy.transform с max и сравните по исходному столбцу year с Series.eq для равных и фильтрации по boolean indexing :

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...