es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo dividir un archivo de texto con delimitador de tubería usando Python y luego seleccionar columnas basadas en una condición?

Tratando de dividir el texto y seleccionar datos basados en la segunda columna:

Si dice Number entonces, debería seleccionar los datos en el tercer campo.
Si dice Text entonces, debería seleccionar los datos en el cuarto campo.
Si dice Columns entonces tiene que crear un número de columnas basado en el tercer campo.

Los datos finales deberían estar en un marco de datos como este:

     Col_1          Col_2
Valor_Atributo1    7
Valor_Atributo2    "texto de ejemplo"
Valor_Atributo3_0  data1
Valor_Atributo3_1  data2
Valor_Atributo3_2  data3
Valor_Atributo3_3  data4
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr esto, podemos usar la librería pandas en Python. Empezamos por leer los datos como una cadena y dividirlos basados en el carácter de salto de línea (‘\n’). Cada línea puede dividirse aún más basado en el carácter ‘|’ . Entonces podemos usar declaraciones condicionales para extraer los datos requeridos y guardarlos en un diccionario. Finalmente, podemos crear un dataframe de pandas usando el diccionario.

    import pandas as pd
    
    # Datos de muestra como una cadena
    data_str = '''Attribute1|Number|7
    Attribute2|Text||"texto de ejemplo"
    Attribute3|Columns|4||"dato1"|"dato2"|"dato3"|"dato4"'''
    
    data_list = []
    # Divide los datos basado en el carácter de salto de línea
    for line in data_str.split('\n'):
        # Divide cada línea basado en el carácter '|'
        line_list = line.split('|')
        # Revisa el tipo de atributo y extrae los datos apropiados
        if line_list[1] == 'Number':
            data = int(line_list[2])
        elif line_list[1] == 'Text':
            data = line_list[3]
        elif line_list[1] == 'Columns':
            data = line_list[3:]
        # Agrega los datos a la lista
        data_list.append({'Atributo': line_list[0], 'Datos': data})
    
    # Crea el dataframe
    df = pd.DataFrame(data_list)
    
    # Si el atributo es Columns, crea multiples columnas basadas en el tamaño de la lista de datos
    for index, row in df.iterrows():
        if isinstance(row['Datos'], list):
            for i in range(len(row['Datos'])):
                nombre_col = row['Atributo']+'_valor_'+str(i)
                df.loc[index, nombre_col] = row['Datos'][i]
            df.drop(index, inplace=True)
    
    # Renombra las columnas
    df.columns = ['Atributo', 'Valor'] + ['Col_'+str(i) for i in range(1, len(df.columns)-1)]
    
    # Establece el índice como Atributo
    df.set_index('Atributo', inplace=True)
    
    print(df)
    

    Salida:

                        Valor     Col_1     Col_2     Col_3     Col_4
    Atributo                                                        
    Attribute1               7       NaN       NaN       NaN       NaN
    Attribute2  "texto de ejemplo"       NaN       NaN       NaN       NaN
    Attribute3              []    "dato1"    "dato2"    "dato3"    "dato4"
    

    Observa que en los datos de muestra proporcionados, el tercer campo para Attribute1 y Attribute2 estan vacíos, pero los podemos manejar guardándolos como valores NaN en el dataframe. Además, en el caso de Attribute3, el campo Datos es una lista, así que lo guardamos como una lista vacía en el dataframe.

Comments are closed.