2016-01-19 155 views
2

注:我使用Python初學者,只是用熊貓幾天前開始。我在R.Python的 - 分割多列分隔符由

我試圖拆分大熊貓數據框的背景下,卻只能通過似乎一個分隔符在同一時間在同一時間分割一列。

我的數據是這樣的:

      0   1    2   3 \ 
0 chr4:43571332-43571643 numsnp=3 length=312 state1,cn=0 
1 chr5:179618873-179628421 numsnp=8 length=9,549 state1,cn=0 

        4     5    6 
0 CCCC.A_1_TR27GD1 startsnp=S-3TZTE endsnp=S-4NDOX 
1 CCCC.A_1_TR27GD1 startsnp=S-3IDBJ endsnp=S-4AKVJ 

我想我的輸出看起來像這樣:

Chromosome  Start  End NumSNP Length StartSNP EndSNP 
0   4 43571332 43571643  3 312 S-3TZTE S-4NDOX 
1   5 179618873 179628421  8 9,549 S-3IDBJ S-4AKVJ 

我知道這是很多,但是這涉及以下內容:

    和-....也除去 「CHR」
  • S:
  • 通過拆分柱0 PLIT列1,2,5,6
  • 重命名&重新排序列

問題: 我已經能夠使用下面的代碼來做到這一點,但想一些指導進一個更高效的代碼。

import pandas as pd 

CNV = pd.read_csv('CCCC_cnv_practice.rawcnv', delimiter="\s+", engine='python', header=None) 

#Get Chromosomes 
ChrPos = pd.DataFrame(CNV[0].str.split(':',1).tolist(), columns = ['Chromosome','Position']) 
Chromosome = ChrPos['Chromosome'].str.lstrip('chr') 

#Get Start and End Positions 
Positions = pd.DataFrame(ChrPos.Position.str.split('-',1).tolist(), columns = ['Start','End']) 

#Get the Numsnp, Length, StartSNP, and EndSNP columns 
Equals1 = CNV.iloc[:,1:3] 
Equals2 = CNV.iloc[:,5:] 
Equals = Equals1.join(Equals2) 

TEST1 = pd.DataFrame(Equals[1].str.split('=',1).tolist()) 
TEST2 = pd.DataFrame(Equals[2].str.split('=',1).tolist()) 
TEST3 = pd.DataFrame(Equals[5].str.split('=',1).tolist()) 
TEST4 = pd.DataFrame(Equals[6].str.split('=',1).tolist()) 

#Put it all together 
frames = [Chromosome, Positions, TEST1[1], TEST2[1], TEST3[1], TEST4[1]] 
Data = pd.concat(frames, axis=1) 
Data.columns = ['Chromosome', 'Start', 'End', 'NumSNP', 'Length', 'StartSNP', 'EndSNP'] 

回答

1

我認爲你可以使用:

print df 
          0   1    2   3 \ 
0 chr4:43571332-43571643 numsnp=3 length=312 state1,cn=0 
1 chr5:179618873-179628421 numsnp=8 length=9,549 state1,cn=0 

        4     5    6 
0 CCCC.A_1_TR27GD1 startsnp=S-3TZTE endsnp=S-4NDOX 
1 CCCC.A_1_TR27GD1 startsnp=S-3IDBJ endsnp=S-4AKVJ 

#new empty dataframe  
df1 = pd.DataFrame() 
df1[['Chromosome', 'tmp']] = pd.DataFrame([ x.split(':') for x in df[0].tolist() ]) 
df1[['Start', 'End']] = pd.DataFrame([ x.split('-') for x in df1['tmp'].tolist() ]) 

#tmp is temporary column 
df1[['tmp', 'NumSNP']] = pd.DataFrame([ x.split('=') for x in df[1].tolist() ]) 
df1[['tmp', 'Length']] = pd.DataFrame([ x.split('=') for x in df[2].tolist() ]) 
df1[['tmp', 'StartSNP']] = pd.DataFrame([ x.split('=') for x in df[5].tolist() ]) 
df1[['tmp', 'EndSNP']] = pd.DataFrame([ x.split('=') for x in df[6].tolist() ]) 

df1['Chromosome'] = df1['Chromosome'].str.lstrip('chr') 

#delete tmp column  
df1 = df1.drop(['tmp'], axis=1) 
print df1 

# Chromosome  Start  End NumSNP Length StartSNP EndSNP 
#0   4 43571332 43571643  3 312 S-3TZTE S-4NDOX 
#1   5 179618873 179628421  8 9,549 S-3IDBJ S-4AKVJ 
+0

這從14行至10滴我的代碼謝謝。沒有辦法做4行'#tmp是臨時列'1個步驟(即,通過'「=」'分割所有列)後? –

+0

我認爲這是不可能的,因爲你'Series.string'工作。數據幀的長度如何 - 「print len(df)'?很大? – jezrael

+0

最大的數據幀有180,000行。 –