2013-09-30 10 views
8

Problema:

Sto cercando di due insiemi di dati relativamente piccole insieme, ma l'unione solleva una MemoryError. Ho due serie di dati di aggregati di dati commerciali nazionali, che sto cercando di unire sulle chiavi anno e paese, quindi i dati devono essere posizionati in modo particolare. Questo purtroppo rende impossibile l'utilizzo di concat e i suoi vantaggi in termini di prestazioni, come mostrato nella risposta a questa domanda: MemoryError on large merges with pandas in Python.Pandas Merge Errore: MemoryError

Ecco il programma di installazione:

Il tentativo di fusione:

df = merge(df, i, left_on=['year', 'ComTrade_CC'], right_on=["Year","Partner Code"]) 

struttura di dati di base:

i:

Year Reporter_Code Trade_Flow_Code Partner_Code Classification Commodity Code Quantity Unit Code Supplementary Quantity Netweight (kg) Value Estimation Code 
0 2003 381  2 36 H2 070951 8 1274 1274 13810 0 
1 2003 381  2 36 H2 070930 8 17150 17150 30626 0 
2 2003 381  2 36 H2 0709 8 20493 20493 635840 0 
3 2003 381  1 36 H2 0507 8 5200 5200 27619 0 
4 2003 381  1 36 H2 050400 8 56439 56439 683104 0 

df:

mporter cod  CC ComTrade_CC Distance_miles 
0 110  215  215  757  428.989 
1 110  215  215  757  428.989 
2 110  215  215  757  428.989 
3 110  215  215  757  428.989 
4 110  215  215  757  428.989 

Errore Traceback:

MemoryError      Traceback (most recent call last) 
<ipython-input-10-8d6e9fb45de6> in <module>() 
     1 for i in c_list: 
----> 2  df = merge(df, i, left_on=['year', 'ComTrade_CC'], right_on=["Year","Partner Code"]) 

/usr/local/lib/python2.7/dist-packages/pandas-0.12.0rc1_309_g9fc8636-py2.7-linux-x86_64.egg/pandas/tools/merge.pyc in merge(left, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy) 
    36       right_index=right_index, sort=sort, suffixes=suffixes, 
    37       copy=copy) 
---> 38  return op.get_result() 
    39 if __debug__: 
    40  merge.__doc__ = _merge_doc % '\nleft : DataFrame' 

/usr/local/lib/python2.7/dist-packages/pandas-0.12.0rc1_309_g9fc8636-py2.7-linux-x86_64.egg/pandas/tools/merge.pyc in get_result(self) 
    193          copy=self.copy) 
    194 
--> 195   result_data = join_op.get_result() 
    196   result = DataFrame(result_data) 
    197 

/usr/local/lib/python2.7/dist-packages/pandas-0.12.0rc1_309_g9fc8636-py2.7-linux-x86_64.egg/pandas/tools/merge.pyc in get_result(self) 
    693     if klass in mapping: 
    694      klass_blocks.extend((unit, b) for b in mapping[klass]) 
--> 695    res_blk = self._get_merged_block(klass_blocks) 
    696 
    697    # if we have a unique result index, need to clear the _ref_locs 

/usr/local/lib/python2.7/dist-packages/pandas-0.12.0rc1_309_g9fc8636-py2.7-linux-x86_64.egg/pandas/tools/merge.pyc in _get_merged_block(self, to_merge) 
    706  def _get_merged_block(self, to_merge): 
    707   if len(to_merge) > 1: 
--> 708    return self._merge_blocks(to_merge) 
    709   else: 
    710    unit, block = to_merge[0] 

/usr/local/lib/python2.7/dist-packages/pandas-0.12.0rc1_309_g9fc8636-py2.7-linux-x86_64.egg/pandas/tools/merge.pyc in _merge_blocks(self, merge_chunks) 
    728   # Should use Fortran order?? 
    729   block_dtype = _get_block_dtype([x[1] for x in merge_chunks]) 
--> 730   out = np.empty(out_shape, dtype=block_dtype) 
    731 
    732   sofar = 0 

MemoryError: 

Grazie per i vostri pensieri!

+0

Sembra che ci siano dei duplicati in 'df' cosa succede quando si rilasciano i duplicati e si uniscono? 'df.drop_duplicates (inplace = True)' – EdChum

+0

Non sono in realtà duplicati. df contiene effettivamente 93 colonne e ogni osservazione è unica per l'anno e il partner commerciale. Volevo solo inserire un piccolo sottoinsieme di dati su SO per evitare confusione. Grazie per l'idea dura! Inoltre, la fusione non sembra essere priva di memoria. Quando lo faccio, non uso più del 50% della memoria. – agconti

+0

Nessun problema, un'altra cosa da controllare che mi ha catturato è se hai dei valori NaN (nulli) in tutte le colonne con cui ti stai unendo, fino a che cosa devi fare, ma vorrei lasciarle anche se hai qualche – EdChum

risposta

2

Nel caso qualcuno imbattersi in questa domanda ancora ha problemi simili con merge, probabilmente si potranno ottenere concat al lavoro rinominando le colonne rilevanti nelle due dataframes agli stessi nomi, impostandole come un MultiIndex (cioè df = dv.set_index(['A','B'])), e quindi usando concat per unirli a loro.