web-dev-qa-db-fra.com

Les pandas fusionnent deux images avec des colonnes différentes

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.

26
economy

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.

43
EdChum

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')
0
Will H