2013-02-15 10 views
7

मुझे मल्टीइंडेक्स के साथ काम करने के लिए "रिक्त" आंतरिक जुड़ना नहीं मिल सकता है। 0.10.1 के तहत, मेरे पास है:मल्टीइंडेक्स के साथ आंतरिक जुड़ने में विफल रहता है यदि कोई ओवरलैप

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') 

जो मुझे

Exception: Cannot infer number of levels from empty list 

देता है वहाँ इस के आसपास किसी भी अच्छा तरीका है? अगर छेड़छाड़ खाली है तो मैं अग्रिम में बताना चाहता हूं, इसलिए मैं अपवाद से बच सकता हूं।

उत्तर

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

मैं इस पर 100% नहीं कर रहा हूँ, लेकिन एक बाहरी कर में शामिल होने और NAS छोड़ने एक आंतरिक में शामिल होने के रूप में ही है। इसलिए कोई मिलान करने वाली संस्थाओं के मामले में, आपको बस एक खाली डेटाफ्रेम मिलता है।

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') 

कौन देता है:: हम एक मिलान रिकॉर्ड शामिल करने के लिए अपने उदाहरण में बदलाव करते हैं, तो इस मामले प्रतीत होता है

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 

और इसलिए बाहरी के बाद dropna() में शामिल होने +, कितनी पंक्तियाँ देख सकते हैं d3 और वहां से जाएं। अपने मूल उदाहरण का उपयोग:

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

हिस्सा द्वारा HDFstore हिस्सा से बहु सूचकांक नोड्स विलय से पाश के लिए में उसकी समस्या मिल गया। इसे इस तरह बदसूरत हल किया, बाद में किसी और के लिए सहायक हो सकता है।

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" 
संबंधित मुद्दे