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)
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.
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.
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