2017-10-21 56 views
1

Je souhaite avoir une trame de données df2 qui contiendra les valeurs de df1. Les deux trames de données ont un index de date. Les deux blocs de données contiennent les mêmes colonnes. Je veux juste mettre à jour les colonnes de df2 si l'index de df2 existe dans df1.Mettre à jour les colonnes dans df2 basé sur df1 sur l'index de date

DF1

Symbol   K1  K2  K3 
Date          
2011-01-10  0.0  0.0  0.0  
2011-01-13 -1500.0  0.0 4000.0  
2011-01-26  0.0 1000.0  0.0 

DF2

   K1  K2  K3 

2011-01-10  0.0  0.0  0.0 
2011-01-11  0.0  0.0  0.0  
2011-01-26  0.0  0.0  0.0 

sortie désiré

   K1  K2  K3  

2011-01-10  0.0  0.0  0.0  
2011-01-11  0.0  0.0  0.0 
2011-01-26  0.0 1000.0  0.0 

J'ai essayé;

df2 = df2.join(df1, on=df1.index, how='left') 

Mais a reçu cette erreur;

raise KeyError('%s not in index' % objarr[mask]) KeyError: "Index([u'2011-01-10', u'2011-01-13', u'2011-01-26', u'2011-02-02',\n

Toute aide est plus que bienvenue.

Merci

Répondre

1

Trouver l'intersection commune sur les indices et utiliser combine_first.

df = df.loc[df.index.intersection(df2.index)].combine_first(df2) 

print(df) 
Symbol  K1  K2 K3 
2011-01-10 0.0  0.0 0.0 
2011-01-11 0.0  0.0 0.0 
2011-01-26 0.0 1000.0 0.0 

Détails

idx = df.index.intersection(df2.index) 
print(idx) 
Index(['2011-01-10', '2011-01-26'], dtype='object') 

print(df.loc[idx]) 
Symbol  K1  K2 K3 
2011-01-10 0.0  0.0 0.0 
2011-01-26 0.0 1000.0 0.0 
+0

Merci pour la réponse rapide. Cependant, cela ne fonctionne pas. Tout ce qui est imprimé est 0. comme le df2 original. –

+0

@Codinghierarchy Quoi! Pouvez-vous ajouter d'autres données qui reproduisent votre problème réel? Comme vous pouvez le voir, cela fonctionne pour ce mini-jeu de données. Veuillez vérifier vos noms de variables et tout le reste. –

+0

Je l'ai ajouté comme: df2 = df1.loc [df1.index.intersection (df2.index)]. Combine_first (df2) –

0

Vous pouvez essayer de fusionner sur les indices:

df3 =df1.merge(df2, left_index=True, right_index=True, suffixes=("","_"), how='right') 
df3= df3.drop(['K1_', 'K2_', 'K3_'], axis=1).fillna(0) 
+0

Cela ne donne malheureusement pas le résultat escompté par OP. –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ, édité – skrubber

+0

Le résultat est manquant une ligne avec l'index '2011-01-11' –