#python #python-3.x #pandas #dataframe
#python #python-3.x #pandas #фрейм данных
Вопрос:
Учитывая игрушечный datafrme следующим образом:
id type name purpose
1 retail tower a sell
retail tower a rent
office t1 sell
2 office t1 rent
retail t2 sell
retail t2 rent
retail s1 sell
5 office s1 rent
Я хочу удалить дубликаты на основе столбцов подмножества type
и name
вместо сохранения first
или last
( df.drop_duplicates(subset = ['type', 'name'], keep= 'last')
) я надеюсь сохранить строку, если id
столбец не None
является.
Ожидаемый результат будет таким:
id type name purpose
1 retail tower a sell
2 office t1 rent
retail t2 rent
retail s1 sell
5 office s1 rent
Как я мог это сделать в Python? Спасибо.
Комментарии:
1. есть
retail t2 sell
, должно быть неправильноretail t2 rent
?2. Вы правы, если мы используем
last
вместоfirst
, я изменил.
Ответ №1:
Вы можете создать вспомогательный столбец, проверив значения, не допускающие пропусков, изменить порядок строк на iloc
и получить индексы по максимальным значениям, это означает, что последнее не пропущенное значение DataFrameGroupBy.idxmax
, последний переход к loc
:
idx = df.assign(tmp = df['id'].notna()).iloc[::-1].groupby(['type','name'])['tmp'].idxmax()
df = df.loc[idx.iloc[::-1]]
print (df)
id type name purpose
0 1.0 retail tower a sell
3 2.0 office t1 rent
5 NaN retail t2 rent
6 NaN retail s1 sell
7 5.0 office s1 rent
Если хотите сохранить первые значения:
idx = df.assign(tmp = df['id'].notna()).groupby(['type','name'], sort=False)['tmp'].idxmax()
df = df.loc[idx]
print (df)
id type name purpose
0 1.0 retail tower a sell
3 2.0 office t1 rent
4 NaN retail t2 sell
6 NaN retail s1 sell
7 5.0 office s1 rent