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

#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_max

3. @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.