¿Forzar a los pandas a interpretar (1,2) en la columna como una cadena y no como un rango?

Tengo este extraño comportamiento en un Dataframe de pandas. Estoy utilizando .apply (single_seats_comma) en una columna con el siguiente contenido de ejemplo: (1,2) . Sin embargo, parece devolverlo como range(1,3) lugar de una cadena (1,2) . Otras filas tienen más de 2 entradas también, por ejemplo (30,31,32) . Tengo una función que se divide y convierte cada valor entre paréntesis en una nueva fila, pero con (x,x) se rompe.

 def single_seats_comma(row): strlist = str(row).split(',') strlist = filter(None, strlist) intlist = [] for el in strlist: intlist.append(int(el)) return intlist 

Ejemplo para ‘aplicar’:

 tickets['seats'][:1].apply(single_seats_comma) 

La salida de error de la definición es

 ValueError: invalid literal for int() with base 10: 'range(1' 

Tratando de encontrar una solución, encontré esto:

 str(tickets['seats'][:1]) >>'0 (1, 2)\nName: seats, dtype: object' tickets['seats'][:1].values >> '[range(1, 3)]' 

Funciona en una columna si los valores son solo 1,2 .

Cualquier ayuda de ayuda es muy apreciada!

Tal vez sería más fácil simplemente iterar sobre los elementos de la fila en lugar de convertirlos en una cadena y luego dividirlos. Esto es lo suficientemente simple como para usar un lambda.

 tickets['seats'][:1].apply(lambda row: [int(e) for e in row]) 

No puedo reproducir la cadena de range . Pero esta función debería funcionar para ambos casos:

 def single_seats_comma(row): if type(row) is tuple: return list(row) elif type(row) is range: res = [row.start] end = row.stop - 1 if end - row.start > 1: res.append(end) return res 

Ejemplo:

 >>> tickets = pd.DataFrame({'seats': [(100, 1022), range(3, 4), range(2, 10)]}) >>> tickets['seats'].apply(single_seats_comma) 0 [100, 1022] 1 [3] 2 [2, 9] Name: seats, dtype: object 

Gracias a todos los colaboradores por acercarme a una solución. La solución es bastante simple.

El desafío era que los pandas interpretaban (1,2) como un rango y no como una cadena. Sin embargo, el objective era crear una lista de todos los valores, originalmente dividiendo una cadena en ‘,’. ¡Innecesario!

list (range (1,2)) ya hace el trabajo. Aquí está el ejemplo y la solución:

 list(range(11, 17)) >> [11, 12, 13, 14, 15, 16] tickets['seats'][0] >> range(1, 3) list(alltickets['seats'][0]) >> [1, 2] 

Entonces solución (es):

 def single_seats_comma(row): strlist = list(row) return strlist tickets['seats'].apply(single_seats_comma) 

o

 tickets['seats'].apply(lambda row: list(row))