当两个单词之间没有空格时拆分列

时间:2017-07-31 14:39:51

标签: pandas dataframe lambda split

我有一个包含以下列的数据框

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

我的目标是将Ann列分成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)]

但看起来空间不是"空间"喜欢拆分它。任何建议都会很棒

2 个答案:

答案 0 :(得分: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] 

答案 1 :(得分: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