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)
代码解释
- 排序环节:
sort_values让每个ID的版本从新到旧排列,这样我们找有效版本时,第一个符合条件的就是最新的可用版本 - 分组筛选:
groupby('ID')把相同ID的行归为一组,自定义函数get_valid_latest_row负责在组内找第一个READY的行 - 过滤空行:
dropna(how='all')会把那些没有任何READY版本的ID对应的空行删掉,最后reset_index让结果的索引更规整
运行这段代码后,你就能得到和预期完全一致的输出啦!
内容的提问来源于stack exchange,提问作者Avinash
相关产品推荐
相关产品推荐

