2016-07-19 15 views
4
verschmelzen

Ich versuche, mehrere Dataframe s zusammenführen/beitreten und bisher habe ich kein Glück. Ich habe merge Methode gefunden, aber es funktioniert nur mit zwei Dataframes. Ich fand auch die SO answer was darauf hindeutet, so etwas zu tun:Mehrere Datenrahmen in Spalte

df1.merge(df2,on='name').merge(df3,on='name') 

Unfortunatelly wird es nicht in meinem Fall arbeiten, weil ich 20+ Anzahl von Datenrahmen.

Meine nächste Idee war es, join zu verwenden. Gemäß der Referenz, wenn ich mehrere Datenrahmen zusammenfüge, muss ich eine Liste verwenden und nur ich kann mich einer Indexspalte anschließen. Also änderte ich Indizes für alle Spalten (ok, kann es grammatisch leicht getan werden) und am Ende mit etwas wie folgt aus:

df.join([df1,df2,df3]) 

Leider auch dieser Ansatz gescheitert, weil andere Spaltennamen sind dieselbe in allen Datenrahmen. Ich habe mich entschieden, das letzte zu tun, nämlich alle Spalten umzubenennen. Aber als ich schließlich alles beigetreten: df = pd.Dataframe() df.join ([DF1, DF2, DF3])

Ich habe leeren Datenrahmen empfangen. Ich habe keine Idee mehr, wie ich mich ihnen anschließen kann. Kann jemand etwas mehr vorschlagen?

EDIT1:

Probeneingang:

import pandas as pd 

df1 = pd.DataFrame(np.array([ 
    ['a', 5, 19], 
    ['b', 14, 16], 
    ['c', 4, 9]]), 
    columns=['name', 'attr1', 'attr2']) 
df2 = pd.DataFrame(np.array([ 
    ['a', 15, 49], 
    ['b', 4, 36], 
    ['c', 14, 9]]), 
    columns=['name', 'attr1', 'attr2']) 

df1 
    name attr1 attr2 
0 a  5 19 
1 b 14 16 
2 c  4  9 

df2 
    name attr1 attr2 
0 a 15 49 
1 b  4 36 
2 c 14  9 

Erwartete Ausgabe:

df 
    name attr1_1 attr2_1 attr1_2 attr2_2 
0 a  5 19  15  49 
1 b 14 16  4  36 
2 c  4  9  14  9 

Indizes könnte zwischen Datenrahmen ungeordnete, aber es ist garantiert, dass sie existiert.

+3

Wenn die Spaltennamen sind die gleichen in allen Datenrahmen, dann was wollen Sie die Ausgabe tatsächlich aussehen wie? – chrisaycock

+0

@chrisaycock Ich habe Beispieleingabe und erwartete Ausgabe hinzugefügt. Ich habe es auf "merge" basiert, wo Pandas automatisch Suffixe zu Namen anderer Spalten hinzufügt – sebap123

Antwort

8

Verwendung pd.concat

dflist = [df1, df2] 
keys = ["%d" % i for i in range(1, len(dflist) + 1)] 

merged = pd.concat([df.set_index('name') for df in dflist], axis=1, keys=keys) 
merged.columns = merged.swaplevel(0, 1, 1).columns.to_series().str.join('_') 

merged 

enter image description here

Oder

merged.reset_index() 

enter image description here

-1

Die Lösung von @piRSquared für 20+ Datenrahmen funktioniert, sehen Sie das folgende Skript für die Erstellung von 20+ Beispieldatenrahmen:

N = 25 
dflist = [] 

for d in range(N): 
    df = pd.DataFrame(np.random.rand(3,2)) 
    df.columns = ['attr1', 'attr2'] 

    df['name'] = ['a', 'b', 'c'] 

    dflist.append(df) 
1

Nutzung reduzieren:

def my_merge(df1, df2): 
    return df1.merge(df2,on='name') 

final_df = reduce(my_merge, df_list) 

Berücksichtigung df_list eine Liste Ihrer Datenrahmen sein

Verwandte Themen