2016-11-21 11 views
1

親のすぐ下に子の行を持つデータフレームのようなツリーを形成するのは苦労しています。私がしようとしているのは、object_id x parent_idをマージして、軸0に沿って連結することです。 私が探しているのは、以下のスニペットでインターレース関数を実装することです。親子関係で2つのデータフレームを結合する方法(連結とマージの間にあるもの)

In[1]: parents = pd.DataFrame({'object_id':[1,2], 
           'parent_id':[0,0], 
           'position': [1,2]}) 

In[2]: parents 

Out[2] object_id  parent_id position 
     0 1    0   1 
     1 2    0   2 

In[3]: children = pd.DataFrame({'object_id':[3,4,5], 
           'parent_id':[1,1,2], 
           'position': [1,2,1]}) 

In[4]: children 

Out[4]: object_id  parent_id position 
     0 3    1   1 
     1 4    1   2 
     2 5    2   1 

In[5]: interlace(parent, children, on=('object_id', 'parent_id')) 

Out[5]: object_id parent_id position 
     0 1   0   1 
     1 3   1   1 
     2 4   1   2 
     3 2   0   1 
     4 5   2   1 

パンダで効率的な方法はありますか? は、私は1つが

parents_with_children = [] 
for i, parentrow in parents.iteritems(): 
    childrenrows = children[children.parent_id == parentrow.object_id] 
    parents_with_children.append(pd.concat([parentrow, childrenrows]) 
result = pd.concat(parents_with_children) 

ような何かを行うことができると思うしかし、私はそこにし、より簡単に、これを行うには、おそらく、より効率的な方法必要があります感じています。

編集:同じレベルと同じ親を持つ行は、その位置で並べ替える必要があります。

答えて

1

可能な解決策:

children['sort_id']=children.parent_id 
parents['sort_id']=parents.object_id 
pd.concat([parents,children]).sort_values(['sort_id', 'parent_id']).drop('sort_id', 1) 
+0

これは動作しますが、結果は、位置列でソート滞在しないでしょう。元々の質問では強調していなかったと思います。 – johnnyB

関連する問題