dividiendo una columna por delimitador pandas python

Tengo una pequeña muestra de datos:

import pandas as pd import pandas as pd df = {'ID': [3009, 129,119,120,121,122,130,3014,266,849,174,844 ], 'V': ['IGHV7-B*01','IGHV7-B*01','IGHV6-A*01','GHV6-A*01','IGHV6-A*01','IGHV6-A*01','IGHV4-L*03','IGHV4-L*03','IGHV5-A*01','IGHV5-A*04','IGHV6-A*02','IGHV6-A*02'], 'Prob': [1,1,0.8,0.8056,0.9,0.805 ,1,1,0.997,0.401,1,1]} df = pd.DataFrame(df) 

parece

 df Out[25]: ID Prob V 0 3009 1.0000 IGHV7-B*01 1 129 1.0000 IGHV7-B*01 2 119 0.8000 IGHV6-A*01 3 120 0.8056 IGHV6-A*01 4 121 0.9000 IGHV6-A*01 5 122 0.8050 IGHV6-A*01 6 130 1.0000 IGHV4-L*03 7 3014 1.0000 IGHV4-L*03 8 266 0.9970 IGHV5-A*01 9 849 0.4010 IGHV5-A*04 10 174 1.0000 IGHV6-A*02 11 844 1.0000 IGHV6-A*02 

Quiero dividir la columna ‘V’ por el delimitador ‘-‘ y moverla a otra columna llamada ‘alelo’

  Out[25]: ID Prob V allele 0 3009 1.0000 IGHV7 B*01 1 129 1.0000 IGHV7 B*01 2 119 0.8000 IGHV6 A*01 3 120 0.8056 IGHV6 A*01 4 121 0.9000 IGHV6 A*01 5 122 0.8050 IGHV6 A*01 6 130 1.0000 IGHV4 L*03 7 3014 1.0000 IGHV4 L*03 8 266 0.9970 IGHV5 A*01 9 849 0.4010 IGHV5 A*04 10 174 1.0000 IGHV6 A*02 11 844 1.0000 IGHV6 A*02 

el código que he probado hasta ahora está incompleto y no funcionó:

 df1 = pd.DataFrame() df1[['V']] = pd.DataFrame([ x.split('-') for x in df['V'].tolist() ]) 

o

 df.add(Series, axis='columns', level = None, fill_value = None) newdata = df.DataFrame({'V':df['V'].iloc[::2].values, 'Allele': df['V'].iloc[1::2].values}) 

Utilice str.split str.split con expand=True :

 In [42]: df[['V','allele']] = df['V'].str.split('-',expand=True) df Out[42]: ID Prob V allele 0 3009 1.0000 IGHV7 B*01 1 129 1.0000 IGHV7 B*01 2 119 0.8000 IGHV6 A*01 3 120 0.8056 GHV6 A*01 4 121 0.9000 IGHV6 A*01 5 122 0.8050 IGHV6 A*01 6 130 1.0000 IGHV4 L*03 7 3014 1.0000 IGHV4 L*03 8 266 0.9970 IGHV5 A*01 9 849 0.4010 IGHV5 A*04 10 174 1.0000 IGHV6 A*02 11 844 1.0000 IGHV6 A*02 

Para almacenar datos en un nuevo dataframe, utilice el mismo enfoque, solo con el nuevo dataframe:

 tmpDF = pd.DataFrame(columns=['A','B']) tmpDF[['A','B']] = df['V'].str.split('-', expand=True) 

Eventualmente (y más útil para mis propósitos) si necesitaría obtener solo una parte del valor de cadena (es decir, texto antes de ‘-‘), podría usar .str.split (…). Str [idx] como:

 df['V'] = df['V'].str.split('-').str[0] df ID V Prob 0 3009 IGHV7 1.0000 1 129 IGHV7 1.0000 2 119 IGHV6 0.8000 3 120 GHV6 0.8056 

– divide los valores ‘V’ en la lista de acuerdo con el separador ‘-‘ y almacena el primer elemento en la columna