2017-10-17 6 views
1

ich zwei Pandas Datenrahmen haben, die Ich mag würde zusammenZusammenführen von zwei Pandas Datenrahmen mit Zeitreihen Index

Zum Beispiel fusionieren/join:

#required packages 
import os 
import pandas as pd 
import numpy as np 
import datetime as dt 

# create sample time series 
dates1 = pd.date_range('1/1/2000', periods=4, freq='10min') 
dates2 = dates1 
column_names = ['A','B','C'] 
df1 = pd.DataFrame(np.random.randn(4, 3), index=dates1, 
columns=column_names) 
df2 = pd.DataFrame(np.random.randn(4, 3), index=dates2, 
columns=column_names) 

df3 = df1.merge(df2, how='outer', left_index=True, right_index=True, suffixes=('_x', '_y')) 

Von hier würde Ich mag die beiden Datensätze in die fusionieren folgende Weise (die Reihenfolge der Spalten) Hinweis:

           A_x  A_y  B_x  B_y  C_x  C_y 
2000-01-01 00:00:00 2000-01-01 00:00:00 -0.572616 -0.867554 -0.382594 1.866238 -0.756318 0.564087 
2000-01-01 00:10:00 2000-01-01 00:10:00 -0.814776 -0.458378 1.011491 0.196498 -0.523433 -0.296989 
2000-01-01 00:20:00 2000-01-01 00:20:00 -0.617766 0.081141 1.405145 -1.183592 0.400720 -0.872507 
2000-01-01 00:30:00 2000-01-01 00:30:00 1.083721 0.137422 -1.013840 -1.610531 -1.258841 0.142301 

I beide Indizes Datenrahmen erhalten möchte, indem entweder ein Mehrindexdatenrahmen erstellen oder eine Spalte für den zweiten Index erzeugt wird. Wäre es einfacher, merge_ordered anstelle von merge oder join zu verwenden?

Jede Hilfe wird geschätzt.

Antwort

1

concat Mit

pd.concat([df1.reset_index().add_suffix('_x'),\ 
df2.reset_index().add_suffix('_y')], axis = 1)\ 
.set_index(['index_x', 'index_y']) 

             A_x  B_x   C_x   A_y   B_y   C_y 
index_x    index_y      
2000-01-01 00:00:00 2000-01-01 00:00:00 -1.437311 -1.414127 0.344057 -0.533669 -0.260106 -1.316879 
2000-01-01 00:10:00 2000-01-01 00:10:00 0.662025 1.860933 -0.485169 -0.825603 -0.973267 -0.760737 
2000-01-01 00:20:00 2000-01-01 00:20:00 -0.300213 0.047812 -2.279631 -0.739694 -1.872261 2.281126 
2000-01-01 00:30:00 2000-01-01 00:30:00 1.499468 0.633967 -1.067881 0.174793 1.197813 -0.879132 
+0

Ich denke, das ist nahe, was ich will, aber die Reihenfolge der Spalten ist nicht genau was ich will. Ich muss es bestellt haben A_x A_y B_x B_y ... und so weiter. Gibt es eine Möglichkeit, die Spalten auf diese Weise zu sortieren? vielleicht noch eine Sortierfunktion? –

+0

@MooseDrool, du kannst df.sort_index verwenden (axis = 1, inplace = True) – Vaishali

+0

Das macht Sinn! –

2

Ich denke, Sie concat wollen, anstatt merge:

In [11]: pd.concat([df1, df2], keys=["df1", "df2"], axis=1) 
Out[11]: 
          df1       df2 
          A   B   C   A   B   C 
2000-01-01 00:00:00 1.621737 0.093015 -0.698715 0.319212 1.021829 1.707847 
2000-01-01 00:10:00 0.780523 -1.169127 -1.097695 -0.444000 0.170283 1.652005 
2000-01-01 00:20:00 1.560046 -0.196604 -1.260149 0.725005 -1.290074 0.606269 
2000-01-01 00:30:00 -1.074419 -2.488055 -0.548531 -1.046327 0.895894 0.423743 
1

merge wird in der Tat beide Indizes verschmelzen.

Sie können die zusätzliche Spalte in df2 erstellen, bevor Sie fusionieren:

df2["index_2"]=df2.index 

, die eine Spalte im Endergebnis schaffen wird, dass der Wert des Index in df2 sein wird.

Bitte beachten Sie, dass der einzige Fall, in dem diese Spalte anders als der Index ist, wenn das Element nicht in df2 erscheint, in diesem Fall wird es null sein, also bin ich mir nicht sicher, ob ich Ihr endgültiges Ziel verstehe.

Verwandte Themen