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

按参考列表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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:44:59