webentwicklung-frage-antwort-db.com.de

Pandas führen zwei Datenframes mit unterschiedlichen Spalten zusammen

Ich vermisse hier sicherlich etwas einfaches. Beim Versuch, zwei Datenrahmen in Pandas zusammenzuführen, die meistens dieselben Spaltennamen haben, der rechte Datenrahmen hat jedoch einige Spalten, die der linke nicht hat, und umgekehrt. 

>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

Ich habe versucht, mit einem äußeren Join zu verbinden:

mayjundf = pd.DataFrame.merge(df_may, df_jun, how="outer")

Aber das ergibt:

Left data columns not unique: Index([....

Ich habe auch eine einzelne Spalte angegeben, für die eine Verknüpfung erstellt werden soll (z. B. on = "id"), aber es werden alle Spalten außer "id" wie attr_1_x, attr_1_y dupliziert, was nicht ideal ist. Ich habe auch die gesamte Liste der Spalten (es gibt viele) an "on" übergeben:

mayjundf = pd.DataFrame.merge(df_may, df_jun, how="outer", on=list(df_may.columns.values))

Was bringt:

ValueError: Buffer has wrong number of dimensions (expected 1, got 2)

Was vermisse ich? Ich möchte ein Dokument mit allen angehängten Zeilen erhalten, und attr_1, attr_2, attr_3, wo immer möglich, NaN, wo sie nicht angezeigt werden. Dies scheint ein ziemlich typischer Workflow für das Munging von Daten zu sein, aber ich stecke fest.

Danke im Voraus.

26
economy

Ich denke in diesem Fall concat ist das, was Sie wollen:

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

indem Sie axis=0 übergeben, stapeln Sie die df's aufeinander, was meiner Meinung nach das ist, was Sie wollen, und erzeugen dann NaN-Werte, bei denen sie in ihren jeweiligen dfs fehlen.

43
EdChum

Ich hatte dieses Problem heute bei der Verwendung von concat, append oder merge. Ich bin darum herumgekommen, indem ich eine Hilfssäule hinzugefügt habe, die fortlaufend nummeriert ist, und dann einen äußeren Join ausführen

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