Я пытаюсь выяснить, произошло ли какое-либо ID
в какой-либо из предыдущих лет (т. Е. Столбец Duplicate
в dfo
).Если это так, я бы хотел отметить строку как дубликат и включить год, в котором ID
впервые появился (то есть Year_Duplicate
).
У меня есть рабочий код.
Цель: я хочу научиться лучше (или «питонизировать»), чтобы решить эту проблему лучше, то есть, если есть более сжатый способ ее решения, я был бы признателен за любую помощь.Я не слишком знаком со всеми функциями, которые мы получаем с numpy
и pandas
Образец ввода
dfi.to_dict() =
{'Year': {0: 2020,
1: 2020,
2: 2020,
3: 2021,
4: 2021,
5: 2021,
6: 2022,
7: 2022,
8: 2022},
'ID': {0: 1, 1: 2, 2: 3, 3: 1, 4: 4, 5: 2, 6: 5, 7: 1, 8: 4},
'$': {0: 1, 1: 1, 2: 1, 3: 2, 4: 2, 5: 2, 6: 3, 7: 3, 8: 3}}
ОбразецВывод:
dfo.to_dict()
{'Year': {0: 2020,
1: 2020,
2: 2020,
3: 2021,
4: 2021,
5: 2021,
6: 2022,
7: 2022,
8: 2022},
'ID': {0: 1, 1: 2, 2: 3, 3: 1, 4: 4, 5: 2, 6: 5, 7: 1, 8: 4},
'$': {0: 1, 1: 1, 2: 1, 3: 2, 4: 2, 5: 2, 6: 3, 7: 3, 8: 3},
'Duplicate': {0: False,
1: False,
2: False,
3: True,
4: False,
5: True,
6: False,
7: True,
8: True},
'Year_Duplicate': {0: nan,
1: nan,
2: nan,
3: 2020.0,
4: nan,
5: 2020.0,
6: nan,
7: 2020.0,
8: 2021.0}}
Рабочий код:
import pandas as pd
from numpy import nan as NA
dfi=pd.DataFrame.from_dict(dfi)
dfo=pd.DataFrame.from_dict(dfo)
df_process = dfi.copy()
df_process['Duplicate']=df_process['ID'].duplicated()
indexes=df_process.groupby('ID')['Year'].idxmin
df_min_year = df_process[['Year','ID']].loc[indexes]
df_min_year=df_min_year.rename(columns={"Year": "Year_Duplicate"})
df_process=pd.merge(df_process,df_min_year,on=['ID'],how='left')
df_process.loc[df_process['Year_Duplicate']==df_process['Year'],'Year_Duplicate']=NA
dfo.equals(df_process) #returns TRUE
Буду рад ответить на любые уточнения.Спасибо за помощь.
Разъяснение по комментариям ниже:
$
- это просто число, обозначающее продажи.Это может быть проигнорировано для дублирования. Year_Duplicate
показывает нам первый год, когда это удостоверение личности произошло.Если дубликатов нет, Year_Duplicate
не требуется, и в этом случае мы оставим это поле пустым.