2013-02-15 4 views
7

マルチインデックスで動作するために "空の"内部結合が得られません。 0.10.1の下で、私が持っている: オーバーラップがないとMultiIndexとの内部結合が失敗する

Exception: Cannot infer number of levels from empty list 

を与える

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

は、この周りに何か良い方法はありますか?交差点が空であるかどうかを事前に伝えたいので、例外を避けることができます。

答えて

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

います:私たちは1つの、一致するレコードを含めるようにあなたの例を変更した場合、これはケースのように表示され、その外側の後に+ dropna()に参加

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 

を、あなたはどのように多くの行を見ることができます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チャンクから複数のインデックスノードをチャンクでマージすることで、forループで問題が発生しました。このように醜いことを解決し、後で誰かのために役立つかもしれません。

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" 
関連する問題