Возникли некоторые трудности при попытке удалить правильные дубликаты из фрейма данных.
У меня есть следующий пример:
import numpy as np
import pandas as pd
test = {'date': ['2012-10-12 10:10:10', '2012-10-12 10:10:10', '2012-10-19 10:55:10',
'2012-11-02 16:08:07', '2012-11-02 16:08:07', '2012-12-12 23:45:21', '2012-12-12 23:45:21'],
'value' : [123, '', 324, '', '', '', 321],}
df = pd.DataFrame(data=test)
Результат можно увидеть ниже:
date value
0 2012-10-12 10:10:10 123
1 2012-10-12 10:10:10
2 2012-10-19 10:55:10 324
3 2012-11-02 16:08:07
4 2012-11-02 16:08:07
5 2012-12-12 23:45:21
6 2012-12-12 23:45:21 321
Мой желаемый результат после удаления повторяющихся дат, как показано ниже:
date value
0 2012-10-12 10:10:10 123
2 2012-10-19 10:55:10 324
3 2012-11-02 16:08:07
6 2012-12-12 23:45:21 321
Однако мои попытки на сегодняшний день не увенчались успехом, как показано ниже:
Попытка 1:-
df = df.drop_duplicates(subset='date')
date value
0 2012-10-12 10:10:10 123
2 2012-10-19 10:55:10 324
3 2012-11-02 16:08:07
5 2012-12-12 23:45:21
Попытка 2: -
df = df.drop_duplicates(subset='date', keep='last')
date value
1 2012-10-12 10:10:10
2 2012-10-19 10:55:10 324
4 2012-11-02 16:08:07
6 2012-12-12 23:45:21 321
Пожалуйста, не могли бы вы помочь мне достичь желаемого результата. Спасибо заранее
import numpy as np
import pandas as pd
test = {'date': ['2012-10-12 10:10:10', '2012-10-12 10:10:10', '2012-10-19 10:55:10',
'2012-11-02 16:08:07', '2012-11-02 16:08:07', '2012-12-12 23:45:21', '2012-12-12 23:45:21'],
'value' : [123, np.nan, 324, np.nan, np.nan, np.nan, 321],}
Это должно сработать!
df = pd.DataFrame(data=test)
df.sort_values(by = "value", inplace = True)
df = df.drop_duplicates(subset='date')
df = df.replace(np.nan, '', regex=True)
df.sort_index()
Вывод выглядит следующим образом:
date value
0 2012-10-12 10:10:10 123
2 2012-10-19 10:55:10 324
3 2012-11-02 16:08:07
6 2012-12-12 23:45:21 321
спасибо Сришти, однако порядок кажется перекошенным
Привет, @windwalker, только что добавил оператор сортировки, чтобы сохранить порядок, пожалуйста, проверьте редактирование, надеюсь, оно поможет!
df.sort_index()
теперь намного чище
import pandas as pd
test = {'date': ['2012-10-12 10:10:10', '2012-10-12 10:10:10', '2012-10-19 10:55:10',
'2012-11-02 16:08:07', '2012-11-02 16:08:07', '2012-12-12 23:45:21', '2012-12-12 23:45:21'],
'value' : [123, '', 324, '', '', '', 321],}
df = pd.DataFrame(data=test)
df["value_not_empty"] = df['value'].map(bool)
df = df.sort_values("value_not_empty")
df = df.drop(columns=["value_not_empty"])
df = df.drop_duplicates('date', keep='last')
df
Привет, Исмаэль, как и решение @Srishti Garg, порядок кажется искаженным, но я благодарен за всю помощь.
Один из подходов состоит в том, чтобы замаскировать пустые строки в столбце value
, затем сгруппировать по date
и агрегировать с помощью first
:
df['value'].mask(df['value'].eq('')).groupby(df['date']).first().fillna('').reset_index()
В качестве альтернативы вы можете замаскировать пустые строки в столбце value
и назначить его временному столбцу key
, затем отсортировать фрейм данных по столбцам date
и key
, а затем по drop_duplicates
:
df['key'] = df['value'].mask(df['value'].eq(''))
df.sort_values(['date', 'key']).drop_duplicates('date').drop('key', 1)
Результат:
date value
0 2012-10-12 10:10:10 123
1 2012-10-19 10:55:10 324
2 2012-11-02 16:08:07
3 2012-12-12 23:45:21 321
дополнительное преимущество сброса индекса также покрывает проблему, о которой я забыл упомянуть. Качественный товар
Что такое «критерии хранения»? Я имею в виду, какие дубликаты остаются в фрейме данных? последний случай? или есть что-то со столбцами значений?