我有一个包含以下列的数据框
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)]
但看起来空间不是"空间"喜欢拆分它。任何建议都会很棒
答案 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)
我使用提取两个组的正则表达式模式。第一个括号抓取整个字符串,而第二个括号抓取字符串的第一部分,不被白色空格打破。然后我使用参数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