2013-02-15 17 views
7

Non riesco a ottenere join interni "vuoti" per lavorare con un MultiIndex. Sotto 0.10.1, ho:L'unione interna con MultiIndex non riesce se non si sovrappone

d1 = pd.DataFrame({ 
    'i1': [1, 2, 2], 
    'i2': [1, 1, 2], 
    'a': [10,20,30]}).set_index(['i1', 'i2']) 
d2 = pd.DataFrame({ 
    'i1': [3, 3], 
    'i2': [1, 2], 
    'b': [40, 50]}).set_index(['i1', 'i2']) 
d1.join(d2, how='inner') 

che mi dà

Exception: Cannot infer number of levels from empty list 

C'è un buon modo per aggirare questo? Mi piacerebbe essere in grado di dire in anticipo se l'intersezione è vuota, quindi posso evitare l'eccezione.

risposta

5

È easier to ask forgiveness than permission:

import pandas as pd 
d1 = pd.DataFrame({'i1': [1, 2, 2], 'i2': [1, 1, 2], 'a': [10, 20, 30]} 
       ).set_index(['i1', 'i2']) 
d2 = pd.DataFrame(
    {'i1': [3, 3], 'i2': [1, 2], 'b': [40, 50]}).set_index(['i1', 'i2']) 
try: 
    d1.join(d2, how='inner') 
except Exception as err: 
    # Change this to however you wish to handle this case. 
    print(err) 
2

io non sono al 100% su questo, ma facendo un outer join e far cadere il NAS è la stessa di un join interno. Quindi, nel caso di nessun indice di corrispondenza, si ottiene solo un dataframe vuoto. Se modifichiamo il vostro esempio per includere un record corrispondente, questo sembra essere il caso:

import pandas as pd 
d1 = pd.DataFrame({ 
    'i1': [1, 2, 2], 
    'i2': [1, 1, 2], 
    'a': [10,20,30]}).set_index(['i1', 'i2']) 
d2 = pd.DataFrame({ 
    'i1': [1, 3], 
    'i2': [1, 2], 
    'b': [40, 50]}).set_index(['i1', 'i2']) 
d3 = d1.join(d2, how='outer').dropna() 
d4 = d1.join(d2, how='inner') 

che dà:

In [9]: d3 
Out[9]: 
     a b 
i1 i2   
1 1 10 40 

In [10]: d4 
Out[10]: 
     a b 
i1 i2   
1 1 10 40 

E così dopo l'outer join + dropna(), si può vedere come numero di righe d3 e vai da lì. Usando il tuo esempio originale:

import pandas as pd 
d1 = pd.DataFrame({ 
    'i1': [1, 2, 2], 
    'i2': [1, 1, 2], 
    'a': [10,20,30]}).set_index(['i1', 'i2']) 
d2 = pd.DataFrame({ 
    'i1': [3, 3], 
    'i2': [1, 2], 
    'b': [40, 50]}).set_index(['i1', 'i2']) 
d3 = d1.join(d2, how='outer').dropna() 
print(d3.shape) # no error, shows "(0, 2)" 
1

ha ottenuto il suo problema nel ciclo for per la fusione a più nodi di indice da HDFstore blocco per blocco. Risolto brutto come questo, potrebbe essere utile per qualcun altro più tardi.

import pandas as pd 
d1 = pd.DataFrame({ 
    'i1': [1, 2, 2], 
    'i2': [1, 1, 2], 
    'a': [10,20,30]}).set_index(['i1', 'i2']) 
d2 = pd.DataFrame({ 
    'i1': [3, 3], 
    'i2': [1, 2], 
    'b': [40, 50]}).set_index(['i1', 'i2']) 
for x in y: 
    try: 
     d3 = d1.join(d2, how='inner') 
    except Exception:    
     print "no merge possible between rows, but let's continue" 
     d3 = d1.join(d2, how='outer').dropna() 
    if len(d3) 
     print "there's a merge" 
     #action 
    print "fail, but still in the race" 
Problemi correlati