#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
это фрейм данных, содержащий содержимое файла.