Удалять дубликаты данных, оставляйте первым или не пустым значение - PullRequest
1 голос
/ 16 марта 2020

У меня есть датафрейм, и я хочу отбросить только для имени двойные даты и взять из двойников только первую запись или значение, если оно заполнено, например:

01/02/19    Paolo   42
01/02/19    Paolo   9

Первый сохранено: 01/02/19 Паоло 42.

01/02/19    Frank   
01/02/19    Frank   30

Второе сохранено: 01.02.19 Фрэнк 30.

При использовании drop_duplicates удаляет почти все и содержит только небольшой набор.

Мой код выглядит следующим образом:

import numpy as np
import pandas as pd

path = 'path'
filename = 'Dummy_File_Test.xlsx'
final_path = path + '/' + filename
print(final_path)
ws_name = 'Sheet1'

df = pd.read_excel(final_path, sheet_name=ws_name)
df.fillna('', inplace=True)
df.drop_duplicates(subset =['Date'], keep = 'first', inplace = True, ignore_index=False) 
print(df)

Данные выглядят следующим образом:

Date    Name    Revenue
01/01/19    Paolo   9
01/02/19    Paolo   42
01/02/19    Paolo   9
01/03/19    Paolo   10
01/04/19    Paolo   38
01/05/19    Paolo   
01/06/19    Paolo   
01/07/19    Paolo   41
01/08/19    Paolo   
01/09/19    Paolo   20
01/10/19    Paolo   
01/11/19    Paolo   3
01/12/19    Paolo   2
01/01/19    Frank   9
01/02/19    Frank   
01/02/19    Frank   30
01/03/19    Frank   10
01/04/19    Frank   
01/05/19    Frank   
01/06/19    Frank   
01/06/19    Frank   
01/07/19    Frank   
01/08/19    Frank   
01/08/19    Frank   
01/09/19    Frank   
01/10/19    Frank   
01/10/19    Frank   48
01/11/19    Frank   22
01/11/19    Frank   
01/12/19    Frank   47
01/01/19    Emilia  
01/02/19    Emilia  12
01/02/19    Emilia  15
01/03/19    Emilia  23
01/04/19    Emilia  25
01/05/19    Emilia  
01/05/19    Emilia  39
01/06/19    Emilia  30
01/06/19    Emilia  24
01/07/19    Emilia  4
01/08/19    Emilia  
01/08/19    Emilia  49
01/09/19    Emilia  24
01/10/19    Emilia  
01/11/19    Emilia  12
01/12/19    Emilia  33

Вывод должен выглядеть следующим образом:

Date    Name    Revenue
01/01/19    Paolo   9
01/02/19    Paolo   42
01/03/19    Paolo   10
01/04/19    Paolo   38
01/05/19    Paolo   
01/06/19    Paolo   
01/07/19    Paolo   41
01/08/19    Paolo   
01/09/19    Paolo   20
01/10/19    Paolo   
01/11/19    Paolo   3
01/12/19    Paolo   2
01/01/19    Frank   9
01/02/19    Frank   30
01/03/19    Frank   10
01/04/19    Frank   
01/05/19    Frank   
01/06/19    Frank   
01/07/19    Frank   
01/08/19    Frank   
01/09/19    Frank   
01/10/19    Frank   48
01/11/19    Frank   22
01/12/19    Frank   47
01/01/19    Emilia  
01/02/19    Emilia  12
01/03/19    Emilia  23
01/04/19    Emilia  25
01/05/19    Emilia  39
01/06/19    Emilia  30
01/07/19    Emilia  4
01/08/19    Emilia  49
01/09/19    Emilia  24
01/10/19    Emilia  
01/11/19    Emilia  12
01/12/19    Emilia  33

1 Ответ

1 голос
/ 17 марта 2020

Обратите внимание на изменение имен столбцов {Date:date, Name:name, Revenue:values}, потому что я сгенерировал собственные данные

Приведите дату к дате и установите ее (дату) в качестве индекса

df['Date']=pd.to_datetime(df['date'])
df.set_index(df['Date'], inplace=True)

Имя сортировки, дата по возрастанию и значения по убыванию, так что самое высокое значение находится сверху

df.sort_values(by=['date','name','value'],ascending=[True, True, False], inplace=True)

Дата и имя группирования при отбрасывании всего остального, кроме первого

df.groupby([df.index.date, df.name])['value'].first()

Если требуется преобразовать обратно в фрейм данных

df.groupby([df.index.date, df.name])['value'].first().to_frame()

Выход

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...