【发布时间】:2016-01-19 16:35:33
【问题描述】:
注意:我是 Python 的初学者,几天前才开始使用 Pandas。我有 R 的背景。
我正在尝试拆分 pandas DataFrame,但似乎一次只能通过一个分隔符拆分一列。
我的数据如下所示:
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
我知道这很多,但这涉及以下内容:
- 用 : 和 -.... 拆分第 0 列,同时删除“chr”
- 拆分列 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']
【问题讨论】: