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