web-dev-qa-db-fra.com

Pandas concat renvoie ValueError: les formes du plan ne sont pas alignées

Je suis assez nouveau pour les pandas, j'essaie de concaténer un ensemble de trames de données et j'obtiens cette erreur:

ValueError: Plan shapes are not aligned

Ma compréhension de .concat() est qu'il se joindra là où les colonnes sont les mêmes, mais pour ceux qu'il ne peut pas trouver, il se remplira de NA. Cela ne semble pas être le cas ici.

Voici la déclaration concat:

dfs = [npo_jun_df, npo_jul_df,npo_may_df,npo_apr_df,npo_feb_df]
alpha = pd.concat(dfs)
37
Lt.Fr0st

Au cas où cela aiderait, j'ai également rencontré cette erreur lorsque j'ai essayé de concaténer deux trames de données (et au moment de la rédaction, c'est le seul hit associé que je puisse trouver sur Google autre que le code source).

Je ne sais pas si cette réponse aurait résolu le problème de l'OP (car il/elle n'a pas publié suffisamment d'informations), mais pour moi, cela a été causé lorsque j'ai essayé de concat dataframe df1 avec colonnes ['A', 'B', 'B', 'C'] (voir les en-têtes de colonne en double?) avec dataframe df2 avec colonnes ['A', 'B']. Naturellement, la duplication a provoqué pandas pour jeter un tremblement. Changer df1 à ['A', 'B', 'C'] (c'est-à-dire supprimer une des colonnes en double) et tout fonctionne bien.

75
user3805082

J'ai récemment reçu ce message aussi, et j'ai trouvé comme utilisateur @ jason et @ user3805082 ci-dessus que j'avais des colonnes en double dans plusieurs des centaines de trames de données que j'essayais de concat, chacun avec des dizaines de noms de var énigmatiques. La recherche manuelle de doublons n'était pas pratique.

Au cas où quelqu'un d'autre aurait le même problème, j'ai écrit la fonction suivante qui pourrait aider.

def duplicated_varnames(df):
    """Return a dict of all variable names that 
    are duplicated in a given dataframe."""
    repeat_dict = {}
    var_list = list(df) # list of varnames as strings
    for varname in var_list:
        # make a list of all instances of that varname
        test_list = [v for v in var_list if v == varname] 
        # if more than one instance, report duplications in repeat_dict
        if len(test_list) > 1: 
            repeat_dict[varname] = len(test_list)
    return repeat_dict

Ensuite, vous pouvez parcourir ce dict pour signaler le nombre de doublons, supprimer les variables dupliquées ou les renommer de manière systématique.

6
William Welsh

A écrit une petite fonction pour concaténer les noms de colonnes dupliqués. La fonction se soucie du tri si la trame de données d'origine n'est pas triée, la sortie sera triée.

def concat_duplicate_columns(df):
    dupli = {}
    # populate dictionary with column names and count for duplicates 
    for column in df.columns:
        dupli[column] = dupli[column] + 1 if column in dupli.keys() else 1
    # rename duplicated keys with °°° number suffix
    for key, val in dict(dupli).items():
        del dupli[key]
        if val > 1:
            for i in range(val):
                dupli[key+'°°°'+str(i)] = val
        else: dupli[key] = 1
    # rename columns so that we can now access abmigous column names
    # sorting in dict is the same as in original table
    df.columns = dupli.keys()
    # for each duplicated column name
    for i in set(re.sub('°°°(.*)','',j) for j in dupli.keys() if '°°°' in j):
        i = str(i)
        # for each duplicate of a column name
        for k in range(dupli[i+'°°°0']-1):
            # concatenate values in duplicated columns
            df[i+'°°°0'] = df[i+'°°°0'].astype(str) + df[i+'°°°'+str(k+1)].astype(str)
            # Drop duplicated columns from which we have aquired data
            df = df.drop(i+'°°°'+str(k+1), 1)
    # resort column names for proper mapping
    df = df.reindex_axis(sorted(df.columns), axis = 1)
    # rename columns
    df.columns = sorted(set(re.sub('°°°(.*)','',i) for i in dupli.keys()))
    return df
2
DiMithras