webentwicklung-frage-antwort-db.com.de

Pandas concat ergibt ValueError: Planformen sind nicht ausgerichtet

Ich bin ganz neu bei Pandas, ich versuche, eine Reihe von Datenrahmen zu verketten, und ich erhalte den folgenden Fehler:

ValueError: Plan shapes are not aligned

Mein Verständnis von .concat() ist, dass es dort zusammenfügt, wo Spalten identisch sind, aber für diejenigen, die es nicht findet, wird es mit NA gefüllt. Dies scheint hier nicht der Fall zu sein.

Hier das concat Statement:

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

Falls es hilft, habe ich auch diesen Fehler gefunden, als ich versucht habe, zwei Datenrahmen zu verketten (und zum Zeitpunkt des Schreibens ist dies der einzige Treffer, den ich auf Google finden kann, außer dem Quellcode).

Ich weiß nicht, ob diese Antwort das Problem des OP gelöst hätte (da er/sie nicht genügend Informationen gepostet hat), aber für mich wurde dies verursacht, als ich versuchte, concat Datenrahmen df1 mit Spalten ['A', 'B', 'B', 'C'] (siehe die doppelten Spaltenüberschriften?) mit Datenrahmen df2 mit Spalten ['A', 'B']. Verständlicherweise verursachte die Vervielfältigung, dass pandas wackelte. Change df1 bis ['A', 'B', 'C'] (d. h. eine der doppelten Spalten löschen) und alles funktioniert einwandfrei.

75
user3805082

Ich habe vor kurzem auch diese Nachricht erhalten und fand wie oben beschrieben den Benutzer @ jason und @ user3805082 , dass ich doppelte Spalten in mehreren der Hunderten von Datenrahmen hatte, die ich versucht habe, concat mit jeweils Dutzenden von rätselhaften Variablennamen. Manuelles Suchen nach Duplikaten war nicht praktikabel.

Falls jemand dasselbe Problem hat, habe ich die folgende Funktion geschrieben, die helfen könnte.

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

Anschließend können Sie dieses Diktat durchlaufen, um zu melden, wie viele Duplikate vorhanden sind, die duplizierten Variablen zu löschen oder sie auf systematische Weise umzubenennen.

6
William Welsh

Schrieb eine kleine Funktion, um doppelte Spaltennamen zu verketten. Die Funktion kümmert sich um das Sortieren. Wenn der ursprüngliche Datenrahmen nicht sortiert ist, wird eine sortierte Ausgabe ausgegeben.

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