You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现:从CSV按规则筛选物料表有效最新版本行求助

解决物料表获取有效最新版本的Python方案

嘿,我来帮你搞定这个物料表的问题!你想要的是每个ID找到最新且状态为READY的版本,如果最新版本是NULL或WITHDRAWN,就往前找,直到找到READY的,没有的话就忽略。先看看你原来的代码问题在哪:你写的drop_duplicates('',keep=last)里,第一个参数没指定列名,而且last没加引号,这肯定运行不起来呀。

下面给你一套完整的解决方案,一步步来:

实现思路

  • 先对数据按ID升序、REV降序排序,这样每个ID的最新版本会排在该组的最前面
  • 按ID分组,对每个分组筛选出状态为READY的行,取其中第一行(也就是最新的有效版本)
  • 过滤掉那些没有任何READY版本的ID

完整代码

import pandas as pd

# 读取你的物料表CSV文件
mydata = pd.read_csv('C:/Myfolder/Python/myfile.csv')

# 按ID升序、REV降序排序,确保每个ID的最新版本在组内最上方
mydata_sorted = mydata.sort_values(['ID', 'REV'], ascending=[True, False])

# 定义函数:从每个ID的分组中获取第一个有效的READY行
def get_valid_latest_row(group):
    # 筛选出当前分组中curr为READY的所有行
    valid_entries = group[group['curr'] == 'READY']
    # 如果有符合条件的行,返回第一行(因为已经排序过,这就是最新的有效版本)
    if not valid_entries.empty:
        return valid_entries.iloc[0]
    # 没有符合条件的就返回None,后续会被过滤
    return None

# 按ID分组处理,然后过滤掉空行,重置索引
final_result = mydata_sorted.groupby('ID').apply(get_valid_latest_row).dropna(how='all').reset_index(drop=True)

# 输出结果
print(final_result)

代码解释

  1. 排序环节:sort_values让每个ID的版本从新到旧排列,这样我们找有效版本时,第一个符合条件的就是最新的可用版本
  2. 分组筛选:groupby('ID')把相同ID的行归为一组,自定义函数get_valid_latest_row负责在组内找第一个READY的行
  3. 过滤空行:dropna(how='all')会把那些没有任何READY版本的ID对应的空行删掉,最后reset_index让结果的索引更规整

运行这段代码后,你就能得到和预期完全一致的输出啦!

内容的提问来源于stack exchange,提问作者Avinash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 16:47:59