2017-10-13 3 views
0

J'ai deux data-frames pandas que je voulais fusionner. Les trames de données ont différentes colonnes et des indices qui se chevauchent. Je veux les fusionner, en gardant l'ordre des indices intact.Fusion de DataFrame avec des index ordonnés et des colonnes différentes

dataframe (d1)

       Dec 16 Dec 15 
Balance Sheet      
NON-CURRENT LIABILITIES   NaN NaN <-- 'all Nan' row 
Other Long Term Liabilities  8.37 9.30 
Long Term Provisions   13.53 12.74 <-- Not present in d2 
Total Non-Current Liabilities 21.90 22.04 
CURRENT LIABILITIES    NaN NaN <-- 'all Nan' row 
Trade Payables     32.49 24.26 

dataframe (d2)

       Dec 11 Dec 10 
Balance Sheet      
NON-CURRENT LIABILITIES   NaN NaN 
Deferred Tax Liabilities [Net] 0.00 7.40 <-- Not present in d1 
Other Long Term Liabilities  14.13 0.00 
Total Non-Current Liabilities 14.13 7.40 
CURRENT LIABILITIES    NaN NaN 
Trade Payables     77.35 60.40 

J'ai essayé les façons de fusionner ces données-cadres, mais aucun d'entre eux travaillaient.

d1.merge(d2, how='left', left_index=True,right_index=True) 

d1.merge(d2, how='outer', left_index=True,right_index=True) 

pd.merge_ordered(d1,d2,left_on=['Dec 16'],right_on=['Dec 11']) 

pd.concat([d1.merge(d2, how='left', left_index=True,right_index=True),d1.merge(d2, how='right', left_index=True,right_index=True)]).drop_duplicates(subset='Dec 16',keep='last') 

J'attends le dataframe résultant pour ressembler à ce

       Dec 16 Dec 15 Dec 11 Dec 10 
Balance Sheet      
NON-CURRENT LIABILITIES   NaN NaN NaN NaN 
Deferred Tax Liabilities [Net] NaN NaN 0.00 7.40 <-- from d2 
Other Long Term Liabilities  8.37 9.30 14.13 0.00 <-- d1+d2 merged 
Long Term Provisions   13.53 12.74 NaN NaN  <-- from d1 
Total Non-Current Liabilities 21.90 22.04 14.13 7.40 <-- d1+d2 merged 
CURRENT LIABILITIES    NaN NaN NaN NaN 
Trade Payables     32.49 24.26 77.35 60.40 

Notez que les questions générales d'ordre (par exemple, toutes les lignes NaN doivent être en ordre), mais pas l'ordre des indices fusionnés entre les lignes «toutes NaN». Aussi les colonnes de d1 devraient venir avant les colonnes d2.

Répondre

0

Utilisation how=outer avec merge et reindex avec ordre personnalisé

In [1424]: order_index = ['NON-CURRENT LIABILITIES', 'Deferred Tax Liabilities [Net]', 
          'Other Long Term Liabilities', 'Long Term Provisions', 
          'Total Non-Current Liabilities', 'CURRENT LIABILITIES', 
          'Trade Payables'] 

In [1425]: df1.merge(df2,how='outer',left_index=True,right_index=True).reindex(order_index) 
Out[1425]: 
           Dec 16 Dec 15 Dec 11 Dec 10 
Balance Sheet 
NON-CURRENT LIABILITIES   NaN  NaN  NaN  NaN 
Deferred Tax Liabilities [Net]  NaN  NaN 0.00  7.4 
Other Long Term Liabilities  8.37 9.30 14.13  0.0 
Long Term Provisions    13.53 12.74  NaN  NaN 
Total Non-Current Liabilities 21.90 22.04 14.13  7.4 
CURRENT LIABILITIES    NaN  NaN  NaN  NaN 
Trade Payables     32.49 24.26 77.35 60.4 

Aussi, join fonctionne

In [1426]: df1.join(df2, how='outer').reindex(order_index) 
Out[1426]: 
           Dec 16 Dec 15 Dec 11 Dec 10 
Balance Sheet 
NON-CURRENT LIABILITIES   NaN  NaN  NaN  NaN 
Deferred Tax Liabilities [Net]  NaN  NaN 0.00  7.4 
Other Long Term Liabilities  8.37 9.30 14.13  0.0 
Long Term Provisions    13.53 12.74  NaN  NaN 
Total Non-Current Liabilities 21.90 22.04 14.13  7.4 
CURRENT LIABILITIES    NaN  NaN  NaN  NaN 
Trade Payables     32.49 24.26 77.35 60.4 

Détails

In [1417]: df1 
Out[1417]: 
           Dec 16 Dec 15 
Balance Sheet 
NON-CURRENT LIABILITIES   NaN  NaN 
Other Long Term Liabilities  8.37 9.30 
Long Term Provisions   13.53 12.74 
Total Non-Current Liabilities 21.90 22.04 
CURRENT LIABILITIES    NaN  NaN 
Trade Payables     32.49 24.26 

In [1418]: df2 
Out[1418]: 
           Dec 11 Dec 10 
Balance Sheet 
NON-CURRENT LIABILITIES   NaN  NaN 
Deferred Tax Liabilities [Net] 0.00  7.4 
Other Long Term Liabilities  14.13  0.0 
Total Non-Current Liabilities 14.13  7.4 
CURRENT LIABILITIES    NaN  NaN 
Trade Payables     77.35 60.4 
+0

Than ks pour la réponse, mais dans les deux cas, les indices sont triés. L'exigence est qu'au moins les lignes «toutes les NaN» doivent rester dans l'ordre. –

+0

Mis à jour avec reindex, ça aide? – Zero

+0

Merci, oui cela aide définitivement. Est-il possible de préparer dynamiquement order_index par union de d1.index et d2.index, puisque ces noms peuvent être différents et non connus auparavant. Merci beaucoup pour toute l'aide. –