按参考列表Family顺序对DataFrame的Source列排序并过滤冗余
问题描述
我有一个包含486列的示例DataFrame:
这是我的示例DataFrame,包含486列
Source Target Value Category_links ANACANTHOBATIDAELC 9 Least Concerned ARHYNCHOBATIDAE DD 1 Data Deficient ARHYNCHOBATIDAE LC 36 Least Concerned ARHYNCHOBATIDAE NT 9 Near Threatened ARHYNCHOBATIDAE VU 3 Vulnerable ARHYNCHOBATIDAE EN 3 Endangered ARHYNCHOBATIDAE CR 2 Critically Endangered CARCHARHINIDAE NT 2 Near Threatened CARCHARHINIDAE VU 7 Vulnerable
另有一个包含57列的参考列表:
这是我的示例参考列表,包含57列
----------------------- Family ----------------------- 1 | Heterodontidae| 2 ||Chlamydoselachidae| 3 | Hexanchidae| 4 | Rhincodontidae| 5 | Orectolobidae| 6 | Odontaspididae| 7 | Lamnidae| 8 | Alopiidae| 9 | Hemiscylliidae| 10 | Brachaeluridae| 11 | Stegostomatidae| 12 |Ginglymostomatidae| 13 | Megachasmidae| 14 | Scyliorhinidae| 15 | Carcharhinidae| 16 | Sphyrnidae| 17 | Triakidae| 18 | Proscylliidae| 19 | Hemigaleidae| 20 | Squalidae| 21 | Pristiophoridae|
需求:按照参考列表中Family的顺序对DataFrame的Source列进行排序,同时排除参考列表中未在DataFrame中出现的Family条目。
解决方案
步骤1:数据预处理
先清理参考列表的Family格式,提取纯Family名称;同时拆分DataFrame的Source列,分离出Family和等级信息。
import pandas as pd # 构建示例DataFrame(实际场景可通过read_csv/Excel等方式导入) df = pd.DataFrame({ 'Source': ['ANACANTHOBATIDAELC', 'ARHYNCHOBATIDAE DD', 'ARHYNCHOBATIDAE LC', 'ARHYNCHOBATIDAE NT', 'ARHYNCHOBATIDAE VU', 'ARHYNCHOBATIDAE EN', 'ARHYNCHOBATIDAE CR', 'CARCHARHINIDAE NT', 'CARCHARHINIDAE VU'], 'Target': [9, 1, 36, 9, 3, 3, 2, 2, 7], 'Value': ['Least Concerned', 'Data Deficient', 'Least Concerned', 'Near Threatened', 'Vulnerable', 'Endangered', 'Critically Endangered', 'Near Threatened', 'Vulnerable'] }) # 处理参考列表:提取清理后的Family名称 ref_families = [ 'Heterodontidae', 'Chlamydoselachidae', 'Hexanchidae', 'Rhincodontidae', 'Orectolobidae', 'Odontaspididae', 'Lamnidae', 'Alopiidae', 'Hemiscylliidae', 'Brachaeluridae', 'Stegostomatidae', 'Ginglymostomatidae', 'Megachasmidae', 'Scyliorhinidae', 'Carcharhinidae', 'Sphyrnidae', 'Triakidae', 'Proscylliidae', 'Hemigaleidae', 'Squalidae', 'Pristiophoridae' ] # 若参考列表来自文件,可通过字符串清理获取: # ref_df = pd.read_csv('reference_list.txt', skiprows=2, sep='|', header=None) # ref_families = ref_df[1].str.strip().tolist() # 从Source列提取Family名称,兼容两种格式(带空格/无空格) def extract_family(source_str): if ' ' in source_str: return source_str.split(' ')[0] # 无空格的情况假设最后2位是等级标识(如ANACANTHOBATIDAELC → ANACANTHOBATIDAE) else: return source_str[:-2] df['Family'] = df['Source'].apply(extract_family)
步骤2:设置排序规则并排序
筛选参考列表中存在于DataFrame的Family,将其设为分类顺序,再对DataFrame排序。
# 筛选参考列表中在DataFrame里存在的Family valid_family_order = [fam for fam in ref_families if fam in df['Family'].unique()] # 将Family列转为有序分类类型 df['Family'] = pd.Categorical(df['Family'], categories=valid_family_order, ordered=True) # 按Family顺序排序,最后删除临时Family列 sorted_df = df.sort_values('Family').drop('Family', axis=1)
最终输出结果
排序后的DataFrame会严格遵循参考列表的Family顺序,且仅保留参考列表中存在的Family对应的行:
Source Target Value 0 ANACANTHOBATIDAELC 9 Least Concerned 1 ARHYNCHOBATIDAE DD 1 Data Deficient 2 ARHYNCHOBATIDAE LC 36 Least Concerned 3 ARHYNCHOBATIDAE NT 9 Near Threatened 4 ARHYNCHOBATIDAE VU 3 Vulnerable 5 ARHYNCHOBATIDAE EN 3 Endangered 6 ARHYNCHOBATIDAE CR 2 Critically Endangered 7 CARCHARHINIDAE NT 2 Near Threatened 8 CARCHARHINIDAE VU 7 Vulnerable
内容的提问来源于stack exchange,提问作者Sajna v.h
相关产品推荐
相关产品推荐

