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

如何删除仅含无效EC值的行并清理混合EC中的无效项?

问题描述

需要处理包含Ko_EC、Gene_ID、Ko_id列的Pandas DataFrame,要求:

  • 删除Ko_EC列仅包含--或x.x.x.-这类无效EC值的行
  • 对于Ko_EC列同时包含有效和无效EC值的行,移除其中的无效EC值(如2.3.1.-、1.1.1.-等),保留有效EC值,生成新的DataFrame

当前代码

# coding=utf-8
import pandas as pd
import numpy as np

#########
classes = [('--', 'c82241_g1', 'K07793'),
         ('3.6.3.-', 'c84674_g1', 'K10041'),
         ('1.2.5.1', 'c82377_g1', 'K00156'),
         ('3.1.1.3 2.3.1.-', 'c87035_g1', 'K14675'),
         ('2.7.2.3', 'c82661_g1', 'K00927'),
         ('1.7.99.4', 'c82688_g1', 'K00371'),
         ('1.1.1.- 1.1.1.76 1.1.1.304', 'c25949_g1', 'K03366'),
         ('1.1.1.-', 'c82777_g1', 'K18369'),
         ('4.1.1.68 5.3.3.-', 'c84443_g1', 'K05921'),
         ('--', 'c84672_g1', 'K02012'),
         ('2.2.1.1', 'c85319_g1', 'K00615'),
         ('3.1.1.-', 'c85321_g1', 'K18372'),
         ('1.8.1.2', 'c85322_g1', 'K00380'),
         ('1.2.1.16 1.2.1.79 1.2.1.20', 'c21528_g1', 'K00135'),
         ('1.10.3.-', 'c86242_g1', 'K00425')]
labels = ['Ko_EC','Gene_ID', 'Ko_id']
alls = pd.DataFrame.from_records(classes, columns=labels)

filt = (~alls['Ko_EC'].str.contains('-'))
all2 = alls.loc[filt, :]
all2

当前运行结果

Ko_EC    Gene_ID   Ko_id
2                      1.2.5.1  c82377_g1  K00156
4                      2.7.2.3  c82661_g1  K00927
5                     1.7.99.4  c82688_g1  K00371
10                     2.2.1.1  c85319_g1  K00615
12                     1.8.1.2  c85322_g1  K00380
13  1.2.1.16 1.2.1.79 1.2.1.20  c21528_g1  K00135

期望结果

Ko_EC    Gene_ID   Ko_id
2                      1.2.5.1  c82377_g1  K00156
3                      3.1.1.3  c87035_g1  K14675
4                      2.7.2.3  c82661_g1  K00927
5                     1.7.99.4  c82688_g1  K00371
6           1.1.1.76 1.1.1.304  c25949_g1  K03366
8                     4.1.1.68  c84443_g1  K05921
10                     2.2.1.1  c85319_g1  K00615
12                     1.8.1.2  c85322_g1  K00380
13  1.2.1.16 1.2.1.79 1.2.1.20  c21528_g1  K00135
解决方案

通过拆分EC值、过滤无效值、重新拼接的方式实现需求,具体步骤如下:

  1. 定义判断EC值是否有效的函数:有效EC值需满足不是--,且结尾不为-(即格式为x.x.x.x的数字结尾)
  2. 对Ko_EC列的每个值,按空格拆分后过滤有效EC值,再重新拼接成字符串
  3. 过滤掉处理后Ko_EC为空的行(即原行全是无效值的情况)

修改后的代码如下:

# coding=utf-8
import pandas as pd
import numpy as np

# 构建原始DataFrame
classes = [('--', 'c82241_g1', 'K07793'),
         ('3.6.3.-', 'c84674_g1', 'K10041'),
         ('1.2.5.1', 'c82377_g1', 'K00156'),
         ('3.1.1.3 2.3.1.-', 'c87035_g1', 'K14675'),
         ('2.7.2.3', 'c82661_g1', 'K00927'),
         ('1.7.99.4', 'c82688_g1', 'K00371'),
         ('1.1.1.- 1.1.1.76 1.1.1.304', 'c25949_g1', 'K03366'),
         ('1.1.1.-', 'c82777_g1', 'K18369'),
         ('4.1.1.68 5.3.3.-', 'c84443_g1', 'K05921'),
         ('--', 'c84672_g1', 'K02012'),
         ('2.2.1.1', 'c85319_g1', 'K00615'),
         ('3.1.1.-', 'c85321_g1', 'K18372'),
         ('1.8.1.2', 'c85322_g1', 'K00380'),
         ('1.2.1.16 1.2.1.79 1.2.1.20', 'c21528_g1', 'K00135'),
         ('1.10.3.-', 'c86242_g1', 'K00425')]
labels = ['Ko_EC','Gene_ID', 'Ko_id']
alls = pd.DataFrame.from_records(classes, columns=labels)

# 定义判断有效EC值的函数
def filter_valid_ec(ec_str):
    # 按空格拆分EC值
    ec_list = ec_str.split()
    # 过滤有效EC:不是--,且结尾不是-
    valid_ec = [ec for ec in ec_list if ec != '--' and not ec.endswith('-')]
    # 重新拼接成字符串,无有效值则返回空
    return ' '.join(valid_ec)

# 处理Ko_EC列
alls['Ko_EC'] = alls['Ko_EC'].apply(filter_valid_ec)

# 过滤掉Ko_EC为空的行(即原行全是无效值)
all2 = alls[alls['Ko_EC'] != ''].reset_index(drop=True)

print(all2)

运行该代码后,输出结果将与期望结果一致。

内容的提问来源于stack exchange,提问作者yan wang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:55:14