【问题标题】:Python - Splitting multiple columns by delimiterPython - 按分隔符拆分多列
【发布时间】: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']

【问题讨论】:

    标签: python join pandas split


    【解决方案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
    

    【讨论】:

    • 这会将我的代码从 14 行减少到 10 行。谢谢。 #tmp is temporary column 之后的 4 行没有办法在 1 步中完成(即按 '=' 拆分所有列)?
    • 我认为这是不可能的,因为您使用的是Series.string。数据帧的长度如何 - print len(df)?很大吗?
    • 最大的数据框有 180,000 行。
    猜你喜欢
    • 2018-06-18
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    相关资源
    最近更新 更多