Pandas如何按文档分组筛选各分组字母序最新版本对应的全部数据行
Pandas 按文档分组筛选最新版本全量条目实现
问题场景
现有存储各文档不同版本下所有条目的DataFrame,例:doc1的A版本包含条目1、2,B版本包含条目5、8。
源数据构造与预览
import pandas as pd df_source=pd.DataFrame([('doc1','A',1,4),('doc1','A',2,0),('doc1','B',5,6),('doc1','B',8,6), ('doc1','C',8,4),('doc1','C',4,4), ('doc2','B',0,5),('doc2','B',1,5), ('doc3','B',5,6),('doc3','K',4,4),('doc3','K',10,4)], columns=['Doc_name','Doc_Issue','item','prop2']) print(df_source)
输出预览:
Doc_name Doc_Issue item prop2 0 doc1 A 1 4 1 doc1 A 2 0 2 doc1 B 5 6 3 doc1 B 8 6 4 doc1 C 8 4 5 doc1 C 4 4 6 doc2 B 0 5 7 doc2 B 1 5 8 doc3 B 5 6 9 doc3 K 4 4 10 doc3 K 10 4
需求说明
筛选后仅保留每个文档(Doc_name)对应最新版本下的所有条目。
预期输出
df_result=pd.DataFrame([('doc1','C',8,4),('doc1','C',4,4), ('doc2','B',0,5),('doc2','B',1,5), ('doc3','K',4,4),('doc3','K',10,4)], columns=['Doc_name','Doc_Issue','item','prop2']) print(df_result)
输出预览:
Doc_name Doc_Issue item prop2 0 doc1 C 8 4 1 doc1 C 4 4 2 doc2 B 0 5 3 doc2 B 1 5 4 doc3 K 4 4 5 doc3 K 10 4
实现代码
如果你的版本号Doc_Issue的字符串排序顺序与版本新旧顺序一致,可直接使用如下代码实现:
# 1. 提取每个文档的最新版本号 latest_ver = df_source.groupby('Doc_name')['Doc_Issue'].max().reset_index() # 2. 关联原表过滤得到最新版本的全量条目 df_result = df_source.merge(latest_ver, on=['Doc_name', 'Doc_Issue'])
注意事项
如果版本号规则不是单纯的字母/数字顺序(比如存在V1.2、V1.11这类字符串排序会误判V1.11 < V1.2的格式),需要先将Doc_Issue转换为可正确排序的格式(比如拆分成版本号元组)后再取最大值。
内容的提问来源于stack exchange,提问作者PabloG
相关产品推荐
相关产品推荐

