2017-07-31 51 views
1

我有以下的列数据帧之间没有空格栏,分裂时,有两个词

Ann 
    Intergenic 
    exon (ENS, exon 2 of 2) 
    promoter-TSS (ENST) 
    TTS (ENST0) 
    intron (ENST, intron 1 of 1 

和我的目标在列安分成Ann1这样,

 Ann Ann1 
    Intergenic Intergenic 
    exon (ENS, exon 2 of 2) exon 
    promoter-TSS (ENST) promoter-TSS 
    TTS (ENST0)    TTS 
    intron (ENST, intron 1 of 1) intron 

所以我试过,

df["Ann1"]=df['Ann'].apply(lambda x: x.split('\s')) 
df["Ann1"] 
     [Intergenic] 
1  [exon (ENST, exon 2 of 2)] 
4    [promoter-TSS (ENST)] 
5      [TTS (ENST)] 
6 [intron (ENST, intron 1 of 1)] 

但它看起来像空间不是“空间”喜欢分裂它。任何建议将是巨大的

回答

3

使用str.split(默认分隔符是空白,因此可以省略)与str[0]用于选择第一个列表值:

df["Ann1"]=df['Ann'].str.split().str[0] 
print (df) 
          Ann   Ann1 
0      Intergenic Intergenic 
1  exon (ENS, exon 2 of 2)   exon 
2   promoter-TSS (ENST) promoter-TSS 
3     TTS (ENST0)   TTS 
4 intron (ENST, intron 1 of 1  intron 

解决方案与str.extract

df["Ann1"]=df['Ann'].str.extract('(\S+)', expand=False) 
print (df) 
          Ann   Ann1 
0      Intergenic Intergenic 
1  exon (ENS, exon 2 of 2)   exon 
2   promoter-TSS (ENST) promoter-TSS 
3     TTS (ENST0)   TTS 
4 intron (ENST, intron 1 of 1  intron 

对于更好的性能是可以使用n=1参数,谢谢piRSquared

df["Ann1"]=df['Ann'].str.split(n=1).str[0] 
+0

Soory也是我能做到这样,最终[ '注释']适用。(拉姆达X:x.split( ' ')[0]) – user1017373

+0

是,'终[' 注释']适用。 (lambda x:x.split()[0])也可以工作,但如果有一些'NaN',则失败。但是,如果没有NaN是可能的使用它。 – jezrael

+0

您可以通过将'n = 1'参数传递给'split'来确保它只会尝试在第一个空白处进行分割,从而使处理器免于工作。 'df [“Ann1”] = df ['Ann']。str.split(n = 1).str [0]' – piRSquared

2

使用pd.Series.str.extract

我使用提取两组正则表达式模式。第一个圆括号抓取整个字符串,而第二个圆括号抓取未被空白区分的字符串的第一部分。然后我使用参数expand=True将两个组放入自己的数据帧列(否则,我们将有一个列表pd.Series)。最后,我使用'?P<name_of_column>'正则表达式来一步命名我的结果列。

df.Ann.str.extract('(?P<Ann>(?P<Ann1>\S*).*)', expand=True) 

          Ann   Ann1 
0     Intergenic Intergenic 
1  exon (ENS, exon 2 of 2)   exon 
2   promoter-TSS (ENST) promoter-TSS 
3     TTS (ENST0)   TTS 
4 intron (ENST, intron 1 of 1  intron