Сохраняйте данные с последней датой из фрейма данных pandas

#python #pandas #csv

#python #pandas #csv

Вопрос:

У меня есть CSV-файл с информацией о программном обеспечении компании вместе с установленными датами. Я читаю файл csv, используя pandas в фрейме данных. Ниже приведены примеры данных, содержащих два разных программного обеспечения:

 software_id software_name                               installed_date    software_version
8331        Intel(R) Graphics Media Accelerator Driver  2009-05-23 0:00   8.15.10.2008
8331        Intel(R) Graphics Media Accelerator Driver  2010-09-15 0:00   8.15.10.2008
8331        Intel(R) Graphics Media Accelerator Driver  2009-12-27 0:00   8.15.10.2008
8332        Wireless Switch Utility                     2009-12-22 0:00   4.3.1400.0
8332        Wireless Switch Utility                     2010-11-22 0:00   4.3.1400.0
8332        Wireless Switch Utility                     2011-01-25 0:00   4.3.1400.0
 

Итак, из приведенных выше данных мне просто нужно сохранить одну строку с последней датой из каждого программного кода. Например, вывод вышеупомянутого файла должен быть:

 software_id     software_name                               installed_date    software_version
    8331        Intel(R) Graphics Media Accelerator Driver  2010-09-15 0:00   8.15.10.2008
    8332        Wireless Switch Utility                     2011-01-25 0:00   4.3.1400.0
 

Как я могу выбрать набор строк для одного программного кода и удалить все строки, кроме строки с последней датой, а затем перейти к следующему программному коду, пока в файле не будет только одна запись на программный код. Я не могу жестко запрограммировать software_id для проверки, поскольку их тысячи.

Моя логика заключается в том, чтобы прочитать и сохранить первый software_id и installed_date в двух переменных и начать чтение файла построчно. В следующей строке будет проверено, совпадает ли идентификатор software_id с тем, который хранится в переменной, а затем сравните дату и сохраните последнюю в переменной. Когда идентификатор software_id не совпадает с сохраненным идентификатором программного обеспечения, это означает, что запущен новый блок software_id. Затем он сохранит предыдущие значения в фрейме данных и начнет выполнение следующих блоков и так далее.

К вашему сведению — я новичок в pandas.

Спасибо за всю помощь.

Ответ №1:

Сначала вам нужно преобразовать installed_date столбец в datetime :

 df['installed_date'] = pd.to_datetime(df['installed_date'])
 

Затем вы можете использовать один из приведенных ниже вариантов:

Вариант 1: sort значения installed_date затем drop_duplicates сохраняют только последнюю строку за software_id .

 df.sort_values('installed_date').drop_duplicates('software_id', keep='last')
 

Вариант 2: group включение softaware_id фрейма данных и агрегирование с использованием idxmax для получения индекса самой последней даты для каждой software_id группы, затем используйте loc этот индекс для фильтрации требуемых строк:

 idx = df.groupby('software_id')['installed_date'].idxmax()
df.loc[idx]
 

Результат:

    software_id                               software_name installed_date software_version
1         8331  Intel(R) Graphics Media Accelerator Driver     2010-09-15     8.15.10.2008
5         8332                     Wireless Switch Utility     2011-01-25       4.3.1400.0
 

Комментарии:

1. Вариант 2 дал мне ошибку ValueError. Но вариант 1 не вызвал никакой ошибки и также не изменил выходной файл. Тем не менее, я взял ваш метод и заставил его работать, разделив его на две строки и используя inplace=True . df.sort_values(by=['software_id','installed_date'],inplace=True) df.drop_duplicates(subset=['software_id'],keep='last',inplace=True)

Ответ №2:

Вы можете сделать groupby , например, так:

 df.groupby("software_id", as_index=False)["software_name", "installed_date", "software_version"].max("installed_date")
 

Он группирует ваши строки по software_id , сохраняет все нужные столбцы и сохраняет для каждой группы строку с наибольшим installed_date значением.

df это фрейм данных, содержащий содержимое файла.