2014-03-24 12 views
10

Ich habe mehrere Dataframes mit den gleichen Spalten, die ich nur auf ihren Indizes zusammenführen möchte.Anfügen von Ebene zu Spalte Index in Python Pandas

print df1 

out[]:    Value ISO 
     Id      
     200001 8432000000 USD 
     200230 22588186000 USD 
     200247 4633000000 USD 
     200291 1188880000 USD 
     200418 1779776000 USD 

print df2 

out[]:    Value ISO 
     Id      
     200001 1.309168e+11 USD 
     200230 5.444096e+10 USD 
     200247 9.499602e+09 USD 
     200291 2.089603e+09 USD 
     200418 3.827251e+09 USD 

print df3 

out[]:   Value 
     Id      
     200001 3.681908 
     200230 3.408507 
     200247 4.531866 
     200291 0.273029 
     200418 3.521822 

konnte ich

pd.concat([df1, df2, df3], axis=1) 

verwenden und

out[]:    Value ISO   Value ISO  Value 
     Id             
     200001 8432000000 USD 1.309168e+11 USD 3.681908 
     200230 22588186000 USD 5.444096e+10 USD 3.408507 
     200247 4633000000 USD 9.499602e+09 USD 4.531866 
     200291 1188880000 USD 2.089603e+09 USD 0.273029 
     200418 1779776000 USD 3.827251e+09 USD 3.521822 

Aber ich verlieren die Informationen bekommen, wo jede Spalte kam. Ich könnte auch eine Zusammenführung auf zwei Datenrahmen tun und die Suffixe Parameter

print df1.merge(df2, left_index=True, right_index=True, suffixes=('_1', '_2')) 

und

out[]:   Value_1 ISO_1  Value_2 ISO_2 
     Id           
     200001 8432000000 USD 1.309168e+11 USD 
     200230 22588186000 USD 5.444096e+10 USD 
     200247 4633000000 USD 9.499602e+09 USD 
     200291 1188880000 USD 2.089603e+09 USD 
     200418 1779776000 USD 3.827251e+09 USD 

dann kann ich meine verschmilzt Daisy-Chain bekommen verwenden, aber die Suffixe Parameter gilt nur für Spalten, die einen Namen teilen . Sobald ich die erste Zusammenführung suffigiert habe, sind die Namen nicht mehr mit dem dritten Datenrahmen identisch.

Ich dachte, die Lösung wäre, eine Ebene an den Spaltenindex jedes Datenrahmens mit den relevanten Informationen, die notwendig sind, um diese Spalten zu unterscheiden. Dann könnte ich ein pd.concat() laufen und etwas, das wie folgt aussieht:

print pd.concat([df1_, df2_, df3_], axis=1) 

out[]:Source   df1    df2   df3 
        Value ISO   Value ISO  Value 
     200001  8.432e+09 USD 1.309168e+11 USD 3.681908 
     200230 2.258819e+10 USD 5.444096e+10 USD 3.408507 
     200247  4.633e+09 USD 9.499602e+09 USD 4.531866 
     200291 1.18888e+09 USD 2.089603e+09 USD 0.273029 
     200418 1.779776e+09 USD 3.827251e+09 USD 3.521822 

Um jedoch diese zu bekommen passieren. Ich musste den Datenrahmen missbrauchen wie so:

df1_ = df1.T 
df1_['Source'] = 'df1' 
df1_.set_index('Source', append=True, inplace=True) 
df1_.index = df1_.index.swaplevel(0, 1) 
df1_ = df1_.T 

Letztlich mag ich ein Ergebnis viel wie die letzte concat Erklärung suchen. Gibt es einen besseren Weg dorthin? Gibt es eine bessere Möglichkeit, eine Ebene an den Spaltenindex anzuhängen?

Danke, PiR

+0

mögliches Duplikat von [Multiindex Datenrahmen aus der Sequenz von Datenrahmen] (http://stackoverflow.com/questions/22546003/multi-index-dataframe-from-sequence-of-dataframes) – joris

Antwort

13

ich Ihnen ein Multiindex möchten, können Sie dies direkt in der concat Funktion tun, um die gleichen Ergebnisse zu erhalten, wie:

pd.concat([df1, df2, df3], axis=1, keys=['df1', 'df2', 'df3']) 

oder

pd.concat({'df1':df1, 'df2':df2, 'df3':df3}, axis=1) 

Siehe auch Multi-index dataframe from sequence of dataframes

+0

Sie haben einen Tippfehler beim Schließen der Wörterbuchklammer. Sollte} anstelle von] sein. –

+0

Danke, jetzt behoben! – joris

Verwandte Themen