将包含多个分隔符的列拆分为多个列

4

我有一个9列的文件。其中一列包含这样的字符串

Unique
3:107912234-107912321(-)
4:107913333-107913322(+)
Y:222002110-221002100(+)
MT:34330044-343123232(-)
X:838377373-834121212(+)

有大约400,000行带有不同字符串的数据。我该如何将其拆分成4个不同的列并保存在同一个数据框中?如果只有一个分隔符,我可以使用df.str(","),但由于这里有不同的分隔符,我感到困惑。

期望输出:

chr  start  end  strand
3    107912234 107912321 -
4    107913333 107913322 + 
Y    222002110 221002100 + 
MT   34330044  343123232 -
X    838377373 834121212 +
2个回答

5
你可以使用extract函数:extract
df1 = df['Unique'].str.extract("(?P<ch>.*?):(?P<start>\d+)-(?P<end>\d+)\((?P<strand>[-+])", 
                               expand=True)
print (df1)
   ch      start        end strand
0   3  107912234  107912321      -
1   4  107913333  107913322      +
2   Y  222002110  221002100      +
3  MT   34330044  343123232      -
4   X  838377373  834121212      +

感谢A-Za-z提出的建议-如果数据在“strand”列中不总是+-
df1 = df['Unique'].str.extract("(?P<ch>.*?):(?P<start>\d+)-(?P<end>\d+)\((?P<strand>.*)\)", 
                              expand=True)
print (df1)
   ch      start        end strand
0   3  107912234  107912321      -
1   4  107913333  107913322      +
2   Y  222002110  221002100      +
3  MT   34330044  343123232      -
4   X  838377373  834121212      +

如果需要将这些列添加到原始的df中,请使用join
print (df.join(df1))
                     Unique  ch      start        end strand
0  3:107912234-107912321(-)   3  107912234  107912321      -
1  4:107913333-107913322(+)   4  107913333  107913322      +
2  Y:222002110-221002100(+)   Y  222002110  221002100      +
3  MT:34330044-343123232(-)  MT   34330044  343123232      -
4  X:838377373-834121212(+)   X  838377373  834121212      +

1
@A-Za-z - 谢谢,我将您的建议添加到答案中。 - jezrael
1
哦,我实际上是指我非常喜欢使用[+-]的解决方案,只是之前不知道它 :) - Vaishali
1
@novicebioinforesearcher - 我添加了解决方案来回答。 - jezrael
1
这是一个有难度的问题,但我认为这段特殊的代码可以将列名翻译成如文档所述。 - jezrael
原始的数据框和新数据框中有相同的名称,所以需要使用 df = df.join(df1, lsuffix='_orig') - jezrael
显示剩余5条评论

1
你可以使用正则表达式将分隔符拆分,然后循环遍历你的 df。
import re

x ='X:838377373-834121212(-)'
[s for s in re.split('\-(?=[0-9])|:|\(|\)', x) if s]

太棒了!我的错...应该测试得更好 ;) - user2510479
我知道这是可以做到的……只需用经过测试的代码进行修正。谢谢你推动我尝试一下 @ Steven Rumbalski - user2510479

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接