2017-07-31 53 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