Сохраняйте строки, если значения одного столбца не равны None, при удалении дубликатов в Pandas

#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