Tengo una enorme DataFrame, donde algunas de las columnas con el mismo nombre. Cuando trato de recoger una columna que existe dos veces, (por ejemplo, del df['col name'] o df2=df['col name']) me sale un error. ¿Qué puedo hacer?

Usando el juguete ejemplo df = DataFrame(np.random.randn(3,3), columns=list('aba')) estas operaciones funcionan bien para mí. Tratar de hacer un pequeño ejemplo que se reproduce el problema.
Podría ser el control de versiones. En 0.8, por ejemplo, creo que incluso tratando de acceder a un duplicado de la columna nombre crea un IndexError, a pesar de que todavía permite que usted cree los datos con nombres duplicados.
Nombres de columna duplicados son un dolor en el culo de los pandas, y en cada paquete y el lenguaje que yo sepa. No se puede crear una columna única cadena de nombres? Como, anexar un entero para hacerlas únicas, en donde sea necesario. Usted está haciendo la vida difícil para ti. En general, cuando col nombres no son únicos en los primeros n caracteres (n, siendo algunos adecuadamente entero pequeño, como 2..10), me tome mi mazo.

OriginalEl autor user3107640 | 2013-12-16

4 Comentarios

  1. 13

    Puede adress columnas de índice:

    >>> df = pd.DataFrame([[1,2],[3,4],[5,6]], columns=['a','a'])
    >>> df
       a  a
    0  1  2
    1  3  4
    2  5  6
    >>> df.iloc[:,0]
    0    1
    1    3
    2    5

    O puede cambiar el nombre de las columnas, como

    >>> df.columns = ['a','b']
    >>> df
       a  b
    0  1  2
    1  3  4
    2  5  6

    OriginalEl autor Roman Pekar

  2. 4

    Esta no es una buena situación. Mejor sería crear un jerárquica de la columna esquema de etiquetado (Pandas permite multi-nivel de la columna de etiquetado o índice de fila de etiquetas). Determinar qué es lo que hace que las dos columnas diferentes que tienen el mismo nombre en realidad diferentes el uno del otro y aprovechar eso para crear una estructura jerárquica de índice de columna.

    En la media hora, si se conoce la posición de la ubicación de las columnas en la lista ordenada de las columnas (por ejemplo, de dataframe.columns), entonces usted puede utilizar muchas de las explícito de indexación de las características, tales como .ix[], o .iloc[] para recuperar los valores de la columna de posición.

    También puede crear copias de las columnas con nombres nuevos, tales como:

    dataframe["new_name"] = data_frame.ix[:, column_position].values

    donde column_position hace referencia a la posicional ubicación de la columna que usted está tratando de conseguir (no el nombre).

    Estos pueden no funcionar para usted si los datos es demasiado grande, sin embargo. Lo mejor es encontrar una manera de modificar el proceso de construcción para obtener la jerarquía de los índices de columna.

    OriginalEl autor ely

  3. 4

    Otra solución:

    def remove_dup_columns(frame):
         keep_names = set()
         keep_icols = list()
         for icol, name in enumerate(frame.columns):
              if name not in keep_names:
                   keep_names.add(name)
                   keep_icols.append(icol)
         return frame.iloc[:, keep_icols]
    
    import numpy as np
    import pandas as pd
    
    frame = pd.DataFrame(np.random.randint(0, 50, (5, 4)), columns=['A', 'A', 'B', 'B'])
    
    print(frame)
    print(remove_dup_columns(frame))

    La salida es

        A   A   B   B
    0  18  44  13  47
    1  41  19  35  28
    2  49   0  30  16
    3  39  29  43  41
    4  26  19  48  13
        A   B
    0  18  13
    1  41  35
    2  49  30
    3  39  43
    4  26  48

    OriginalEl autor leitungswasser

  4. 1

    La siguiente función elimina columnas con dublicate nombres y mantiene sólo uno. No es exactamente lo que usted pidió, pero se puede utilizar retales de resolver su problema. La idea es volver el índice de los números y, a continuación, usted puede direccion, la columna específica índices directamente. Los índices son únicos, mientras que los nombres de columna no son

    def remove_multiples(df,varname):
        """
        makes a copy of the first column of all columns with the same name,
        deletes all columns with that name and inserts the first column again
        """
        from copy import deepcopy
        dfout = deepcopy(df)
        if (varname in dfout.columns):
            tmp = dfout.iloc[:, min([i for i,x in enumerate(dfout.columns == varname) if x])]
            del dfout[varname]
            dfout[varname] = tmp
        return dfout

    donde

    [i for i,x in enumerate(dfout.columns == varname) if x]

    es la parte que necesita

    Yo tenía el mismo problema y trató de su función, sin embargo parece que deepcopy es una función de una biblioteca específica – NameError: name ‘deepcopy’ no está definido. Que lib es?
    abutremutante: su: a partir de una copia de importación deepcopy lo he añadido por encima de

    OriginalEl autor horseshoe

Dejar respuesta

Please enter your comment!
Please enter your name here