如何高效筛选Pandas DataFrame中id前缀唯一且后缀字母最大的行?
高效实现方法
针对你的需求,推荐利用Pandas的分组+矢量化操作来实现,这是处理这类分组筛选场景的高效方案,避免了循环遍历的性能损耗,适合大数据量场景。
步骤说明:
- 提取前缀分组键:从
id列中拆分出xxxxxx-xxx-部分作为分组依据,通过拆分最后一个-来获取前缀,比固定切片更灵活(即使格式有微小变化也能适配)。 - 分组筛选后缀最大的行:按前缀分组后,利用字符串的ASCII码特性(大写字母Z的ASCII值最大),直接取每个组中
id值最大的行——因为id的后缀是字母,整个id的最大值对应的就是后缀字母排序最后一位的行。 - 提取目标行:通过分组得到的最大行索引,从原DataFrame中筛选出结果。
代码实现:
首先构造示例DataFrame:
import pandas as pd data = { 'id': ['095082-000-A', '095772-101-A', '095082-000-B', '095772-101-E', '095772-101-Z', '095772-101-D', '095082-000-F', '015082-001-A'], 'user name': ['name1', 'name2', 'name3', 'name4', 'name5', 'name6', 'name7', 'name8'] } df = pd.DataFrame(data)
然后执行筛选:
# 提取前缀:拆分最后一个'-',取前面的部分 df['prefix'] = df['id'].str.rsplit('-', n=1).str[0] # 按前缀分组,获取每个组中id最大的行的索引 max_idx = df.groupby('prefix')['id'].idxmax() # 根据索引提取结果 result = df.loc[max_idx].drop('prefix', axis=1) print(result)
输出结果:
id user name 4 095772-101-Z name5 6 095082-000-F name7 7 015082-001-A name8
性能说明:
这个方案全程使用Pandas的内置矢量化函数,groupby和idxmax都是经过优化的底层实现,比Python层面的循环快几个数量级,即使处理十万级以上的数据也能快速完成。
内容的提问来源于stack exchange,提问作者Man Fan
相关产品推荐
相关产品推荐

