Il me manque sûrement quelque chose de simple ici. Essayez de fusionner deux images dans des pandas qui portent généralement le même nom de colonne, mais le cadre de données de droite contient des colonnes que la gauche n’a pas, et inversement.
>df_may
id quantity attr_1 attr_2
0 1 20 0 1
1 2 23 1 1
2 3 19 1 1
3 4 19 0 0
>df_jun
id quantity attr_1 attr_3
0 5 8 1 0
1 6 13 0 1
2 7 20 1 1
3 8 25 1 1
J'ai essayé de joindre avec une jointure externe:
mayjundf = pd.DataFrame.merge(df_may, df_jun, how="outer")
Mais cela donne:
Left data columns not unique: Index([....
J'ai également spécifié une seule colonne à rejoindre (on = "id", par exemple), mais cela duplique toutes les colonnes sauf "id" comme attr_1_x, attr_1_y, ce qui n'est pas idéal. J'ai également passé la liste complète des colonnes (il y en a beaucoup) à "on":
mayjundf = pd.DataFrame.merge(df_may, df_jun, how="outer", on=list(df_may.columns.values))
Quels rendements:
ValueError: Buffer has wrong number of dimensions (expected 1, got 2)
Qu'est-ce que je rate? Je voudrais obtenir un df avec toutes les lignes ajoutées, et attr_1, attr_2, attr_3 rempli si possible, NaN où ils ne se présentent pas. Cela semble être un flux de travail assez typique pour la collecte de données, mais je suis bloqué.
Merci d'avance.
Je pense que dans ce cas concat
est ce que vous voulez:
In [12]:
pd.concat([df,df1], axis=0, ignore_index=True)
Out[12]:
attr_1 attr_2 attr_3 id quantity
0 0 1 NaN 1 20
1 1 1 NaN 2 23
2 1 1 NaN 3 19
3 0 0 NaN 4 19
4 1 NaN 0 5 8
5 0 NaN 1 6 13
6 1 NaN 1 7 20
7 1 NaN 1 8 25
en passant axis=0
ici, vous empilez les df les uns sur les autres, ce qui, je le crois, est ce que vous voulez, puis vous produisez une valeur NaN
où ils sont absents de leurs dfs respectifs.
J'ai eu ce problème aujourd'hui en utilisant l'un des éléments suivants: concat, append ou fusion, et je l'ai contourné en ajoutant une colonne d'assistance numérotée séquentiellement, puis en effectuant une jointure externe.
helper=1
for i in df1.index:
df1.loc[i,'helper']=helper
helper=helper+1
for i in df2.index:
df2.loc[i,'helper']=helper
helper=helper+1
df1.merge(df2,on='helper',how='outer')