我有一个包含公司软件详细信息和安装日期的 csv 文件。我正在数据框中使用熊猫读取 csv 文件。以下是包含两个不同软件的示例数据:
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
Run Code Online (Sandbox Code Playgroud)
因此,根据上述数据,我只需要保留一行,其中包含每个软件代码的最新日期。例如,上面文件的输出应该是:
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
Run Code Online (Sandbox Code Playgroud)
如何为一个软件代码选择一组行并删除除日期最新的行之外的所有行,然后移动到下一个软件代码,直到文件中每个软件代码只有一个条目。我无法对 software_id 进行硬编码以进行检查,因为它们有数千个。
我的逻辑是将第一个 software_id 和 installed_date 读取并存储在两个变量中,然后开始逐行读取文件。下一行将检查 software_id 是否与存储在变量中的匹配,然后比较日期并将最新的日期存储在变量中。当 software_id 与存储的软件 id 不匹配时,这意味着新的 software_id 块已经启动。然后它将之前的值存储在数据帧中并开始执行下一个块等等。
仅供参考 - 我是熊猫菜鸟。
感谢所有的帮助。
首先,您需要将installed_date列转换为datetime:
df['installed_date'] = pd.to_datetime(df['installed_date'])
Run Code Online (Sandbox Code Playgroud)
然后您可以使用以下选项之一:
选项 1: 然后仅保留每个 的最后一行的sort值。installed_datedrop_duplicatessoftware_id
df.sort_values('installed_date').drop_duplicates('software_id', keep='last')
Run Code Online (Sandbox Code Playgroud)
选项 2: group使用数据帧进行softaware_id聚合idxmax以获取每组最近日期的索引software_id,然后使用loc此索引来过滤所需的行:
idx = df.groupby('software_id')['installed_date'].idxmax()
df.loc[idx]
Run Code Online (Sandbox Code Playgroud)
结果:
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
Run Code Online (Sandbox Code Playgroud)