Pandas条件解析列

时间:2018-03-23 19:06:33

标签: python pandas parsing lambda

我有一个如下所示的数据框:

    CCDS    Size    gene    exonCount
10804   NM_001320648_exon_4_0_chr21_44515804_r  50  U2AF1L5 8
9385    NM_018964_intron_9_0_chr21_43967251_f   6921    SLC37A1 21
1253    NM_004540_intron_4_0_chr21_22664562_f   32141   NCAM2   18
5233    NM_203417_intron_1_0_chr21_35893957_r   1878    RCAN1   4
3242    NM_001353691_intron_0_0_chr21_32493156_r    3684    TIAM1   30

我想解析CCDS专栏并以下列方式引入一个名为farme的新专栏:

1)如果CCDS列的最后一个字段(基于“_”解析后)为f,则frame值为df['CCDS'].str.split('_').str[3]+1; &安培;

2)如果CCDS列的最后一个字段是r,那么frame值将等于|exonCount-df['CCDS'].str.split('_').str[3]|的绝对值

我试图设计一个lambda函数,但我不确定如何详细说明else条件:

df['frame'] = df.Set.map( lambda x: df['CCDS'].str.split('_').str[3]+1
                         if intronExon_LDU['CCDS'].str.split('_').str[7] == 'f' 
                         else ????)

1 个答案:

答案 0 :(得分:2)

使用np.where(可以轻松推广到多个/嵌套条件)

v = df['CCDS'].str.split('_').str[3].astype(int)
df['frame'] = np.where(df['CCDS'].str.endswith('f'), v + 1, v)

或者,loc带有布尔掩码,

df['frame'] = v
df.loc[df['CCDS'].str.endswith('f'), 'frame'] += 1

使用str.endswith干净地生成蒙版。