2017-10-18 14 views
1

J'ai essayé de faire correspondre deux trames de données sur trois colonnes, à savoir "ticker", "year" et "quarter". Alors que le premier ensemble de données contient deux observations (deux rangées) pour chaque ticker, année, trimestre, le second ne contient qu'une seule ligne ... en particulier, la première image capture toujours deux haut-parleurs différents dans le même quart tandis que la seconde capture uniquement information. Maintenant, je veux faire correspondre la trame de données de telle sorte que chacune des deux rangées de la première trame de données dans le même trimestre ferme soit fusionnée avec la rangée pertinente dans la seconde trame de données.Joindre deux données dans lesquelles chaque ligne d'une même image correspond à deux lignes d'une autre trame

Mes données se présente comme suit: df

ticker year quarter exec_lname jobposition 
XX  2009 3  A   CEO 
XX  2009 3  B   CFO 
XX  2009 4  A   CEO 
XX  2009 4  B   CFO 
YY  2007 1  C   CEO 
YY  2007 1  D   CFO 
YY  2007 2  C   CEO 
YY  2007 2  D   CFO 
ZZ  2008 3  F   CEO 
ZZ  2008 3  G   CFO 

dfnew

ticker year quarter eps calldate 
XX  2009 3  x Mar 
XX  2009 4  y Apr 
YY  2007 1  z Feb 
YY  2007 2  a Jan 
ZZ  2008 3  b Dec 

A la fin, il devrait ressembler à ceci:

ticker year quarter exec_lname jobposition eps calldate 
XX  2009 3  A   CEO   x Mar 
XX  2009 3  B   CFO   x Mar 
XX  2009 4  A   CEO   y Apr 
XX  2009 4  B   CFO   y Apr 
YY  2007 1  C   CEO   z Feb 
YY  2007 1  D   CFO   z Feb 
YY  2007 2  C   CEO   a Jan 
YY  2007 2  D   CFO   a Jan 
ZZ  2008 3  F   CEO   b Dec 
ZZ  2008 3  G   CFO   b Dec 

J'ai essayé:

dfjoin = pd.merge(dfnew, df, how='left', left_on=['ticker', "year", "quarter"], right_on = ['ticker', "year", "quarter"]) 

mais il retourne le nouveau jeu de données avec toutes les lignes et colonnes appropriées, mais avec les colonnes eps et calldate complètement rempli de NaN. Est-ce que c'est parce que je veux fusionner chaque ligne deux fois à df? Le problème n'est pas la fusion sur plus d'une clé - le problème pourrait être que dans la première trame de données j'ai toujours deux lignes avec la même combinaison de ticker/year/quarter.

J'espère que quelqu'un peut m'aider! Merci! Julia

+0

utiliser juste df1.merge (DF2, sur = ['ticker', 'year', 'quarter']) – Vaishali

+0

Copie possible de [Fusionner deux tables basées sur plusieurs clés dans Python pandas] (https://stackoverflow.com/questions/32277473/merge-two-tables-based -on-multiple-keys-in-python-pandas) – Vaishali

+0

Cela me laisse avec toutes les colonnes mais 0 lignes ... – Julia

Répondre

0

Utilisez la fusion avec le paramètre par défaut comment = 'intérieur'

df.merge(dfnew, on = ['ticker', 'year', 'quarter']) 

Vous obtenez

ticker year quarter exec_lname jobposition eps calldate 
0 XX  2009 3  A   CEO   x Mar 
1 XX  2009 3  B   CFO   x Mar 
2 XX  2009 4  A   CEO   y Apr 
3 XX  2009 4  B   CFO   y Apr 
4 YY  2007 1  C   CEO   z Feb 
5 YY  2007 1  D   CFO   z Feb 
6 YY  2007 2  C   CEO   a Jan 
7 YY  2007 2  D   CFO   a Jan 
8 ZZ  2008 3  F   CEO   b Dec 
9 ZZ  2008 3  G   CFO   b Dec 
+0

Quand je fais cela, je suis parti avec 0 lignes et toutes les colonnes ... si je fais externe, alors toutes les lignes sont ajoutées deux fois, une avec seulement info ticker, année, trimestre, exec_lname, jobposition, puis une fois avec ticker, année, quart, eps, calldate ... avec intérieur je n'ai pas de rangée du tout. – Julia

+0

Hmm, il est difficile d'aider lorsque nous ne sommes pas en mesure de reproduire l'erreur. Cela fonctionne bien sur les données que vous avez fournies – Vaishali

0

Il suffit de fusionner les deux trames de données et spécifier les noms de variables dans la section "par".

fusion (df, dfnew, par = c ("ticker", "année", "trimestre"), all.x = TRUE)

+1

Man, ceci est 'R'' merge' – Wen