2017-05-03 149 views
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 + 

回答

5

您可以使用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  + 
+0

@StevenRumbalski - 谢谢你,我是你的建议添加到代码。 – jezrael

+0

这是一如既往的伟大!我没有意识到[ - +]的用法,我可能只是使用(。*?)它是否也适用于其他字符? – Vaishali

+1

@ A-Za-z - 谢谢,我添加你的建议来回答。 – jezrael

1

您可以使用正则表达式来环路分隔符拆分为您的DF

import re 

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

很棒!我的坏...应该有更好的测试;) – user2510479

+0

我知道它可以做...只是用测试代码纠正它。感谢推动我尝试@ Steven Rumbalski – user2510479