#python #pandas #dataframe #pandas-groupby
#python #pandas #фрейм данных #pandas-groupby
Вопрос:
У меня есть фрейм данных, как показано ниже:
product_id date status
1 2018-09-11 G
1 2016-01-11 B
1 2018-02-11 P
2 2019-06-12 P
2 2020-10-11 P
3 2019-07-21 G
3 2016-09-11 B
3 2018-12-15 B
3 2020-11-07 P
:
:
n 2020-11-11 G
Поскольку у меня есть дубликат product_id, я думаю сгруппировать по идентификатору продукта и отфильтровать только самую раннюю дату соответствующего product_id, но мой столбец date не является объектом datetime, поэтому мне нужно сначала преобразовать его в datetime, или мне не нужно, если есть другой способ сделать это. Выходной фрейм данных должен выглядеть следующим образом:
product_id date status
1 2016-01-11 B
2 2019-06-12 P
3 2016-09-11 B
:
:
n 2020-11-11 G
Мне интересно, есть ли какие-либо лучшие или более быстрые способы достижения моей цели, кроме использования group by или, возможно, удаления дубликатов?
Ответ №1:
Используйте to_datetime
с DataFrameGroupBy.idxmin
для индекса минимальной даты и времени, что является самым ранним, и выбирайте значения по DataFrame.loc
:
df['date'] = pd.to_datetime(df['date'])
df = df.loc[df.groupby('product_id')['date'].idxmin()]
print (df)
product_id date status
1 1 2016-01-11 B
3 2 2019-06-12 P
6 3 2016-09-11 B
Подробно: idxmin
возвращать индексы product_id
с минимальной датой:
print (df.groupby('product_id')['date'].idxmin())
product_id
1 1
2 3
3 6
Name: date, dtype: int64
Или используйте DataFrame.sort_values
с DataFrame.drop_duplicates
:
df['date'] = pd.to_datetime(df['date'])
df = df.sort_values(['product_id','date']).drop_duplicates('product_id')
print (df)
product_id date status
1 1 2016-01-11 B
3 2 2019-06-12 P
6 3 2016-09-11 B
Комментарии:
1. Это работает, большое вам спасибо! И если вы не возражаете, если я спрошу, не могли бы вы объяснить, что такое idxmin и как это работает, потому что я не очень хорошо с этим знаком
2. @CodingStark
idxmin
amp;idxmax
— это подход pandas к argmax en.wikipedia.org/wiki/Arg_max3. @CodingStark — я добавляю некоторые подробности для ответа, чтобы увидеть, как
idxmin
здесь работает пример данных.4. @jezrael Большое вам спасибо! Рад, что я изучаю новые вещи!!!
Ответ №2:
Ваши даты указаны в порядке ГГГГ-ММ-ДД, ISO-8601
определение. Таким образом, вы можете просто отсортировать по нему:
print (df.sort_values("date").drop_duplicates("product_id").sort_index())
product_id date status
1 1 2016-01-11 B
3 2 2019-06-12 P
6 3 2016-09-11 B
Комментарии:
1. Я думаю, потому что производительность всегда лучше всего конвертирует даты в datetimes.