2017-10-17 3 views
1

J'ai deux pandas dataframes que je voudrais fusionner/join ensembleFusionner deux pandas dataframes avec index timeseries

Par exemple:

#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')) 

De là, je voudrais fusionner les deux ensembles de données dans le manière suivante (note l'ordre des colonnes):

           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 

je voudrais préserver les indices de trame de données soit par la création d'une trame de données multi-index ou la création d'une colonne pour le second index. Serait-il plus facile d'utiliser merge_ordered au lieu de fusionner ou rejoindre?

Toute aide est appréciée.

Répondre

1

En utilisant concat

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

Je pense que c'est proche de ce que je veux mais l'ordre des colonnes n'est pas exactement ce que je veux. Je dois le commander A_x A_y B_x B_y ... et ainsi de suite. Y at-il un moyen de trier les colonnes de cette façon? peut-être une fonction de tri en plus de cela? –

+0

@MooseDrool, vous pouvez utiliser df.sort_index (axis = 1, inplace = True) – Vaishali

+0

Cela a du sens! –

2

Je pense que vous voulez concat plutôt que de fusion:

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 va en effet fusionner les deux indices.

Vous pouvez créer la colonne supplémentaire dans df2 avant de fusionner:

df2["index_2"]=df2.index 

qui va créer une colonne dans le résultat final qui sera la valeur de l'indice dans df2.

Veuillez noter que le seul cas où cette colonne sera différente de l'index est quand l'élément n'apparaît pas dans df2, auquel cas il sera nul, donc je ne suis pas sûr d'avoir compris votre objectif final dans ceci.