如何删除仅含无效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值、过滤无效值、重新拼接的方式实现需求,具体步骤如下:
- 定义判断EC值是否有效的函数:有效EC值需满足不是
--,且结尾不为-(即格式为x.x.x.x的数字结尾) - 对
Ko_EC列的每个值,按空格拆分后过滤有效EC值,再重新拼接成字符串 - 过滤掉处理后
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
相关产品推荐
相关产品推荐

