分裂时,有两个词
问题描述:
我有以下的列数据帧之间没有空格栏,分裂时,有两个词
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)]
但它看起来像空间不是“空间”喜欢分裂它。任何建议将是巨大的
答
使用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]
答
我使用提取两组正则表达式模式。第一个圆括号抓取整个字符串,而第二个圆括号抓取未被空白区分的字符串的第一部分。然后我使用参数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
Soory也是我能做到这样,最终[ '注释']适用。(拉姆达X:x.split( ' ')[0]) – user1017373
是,'终[' 注释']适用。 (lambda x:x.split()[0])也可以工作,但如果有一些'NaN',则失败。但是,如果没有NaN是可能的使用它。 – jezrael
您可以通过将'n = 1'参数传递给'split'来确保它只会尝试在第一个空白处进行分割,从而使处理器免于工作。 'df [“Ann1”] = df ['Ann']。str.split(n = 1).str [0]' – piRSquared