2016-08-18 54 views
1

在下面DataFrame,即df1追加一個數據幀到另一個數據框,在一個特定的多指標

In[0]: df1 
Out[0]: 
        A   B 
first second      
bar one  1.764052 0.400157 
     one  0.978738 2.240893 
     one  1.867558 -0.977278 
     two  0.950088 -0.151357 

我希望多指標('bar','one')的最後一行後追加另一DataFrame,同時給予新增加行相同的MultiIndex

也就是說,以下df2

In[1]: df2 
Out[1]: 

        A   B 
first second      
baz three -0.103219 0.410599 
     three 0.144044 1.454274 

期望的結果是:

     A   B 
first second      
bar one  1.764052 0.400157 
     one  0.978738 2.240893 
     one  1.867558 -0.977278 
     one -0.103219 0.410599 # there 2 rows 
     one  0.144044 1.454274 # arrived from df2 
     two  0.950088 -0.151357 

到目前爲止是個問題。

我的一些嘗試失敗了未來:

(1)迭代通過組(使用groupby)和concating一個新的數據幀基於df2值:

for idx, data in df1.groupby(level=[0,1]): 
    df1.loc[idx] = pd.concat([data, pd.DataFrame(df2, index=idx)], ignore_index=True) 

Exception: cannot handle a non-unique multi-index! 

(也試過將它們在新的DataFrame)。

(2)reindexingdf2 priorly:

for idx, data in df1.groupby(level=[0,1]): 
    df2.reindex(idx) 

Exception: cannot handle a non-unique multi-index! 

或者:

for idx, data in df1.groupby(level=[0,1]): 
    df2.index = idx 
    break 

      A   B 
bar -0.103219 0.410599 
one 0.144044 1.454274 

回答

1

如果你想手動數據插入到現有的數據幀,你需要決定兩件事情。

  1. 你打算插入它的位置?我通過找到索引爲('bar', 'one')的第一個實例來解決這個問題。
  2. 你打算怎麼稱呼這些數據?換句話說,你插入的數據的索引是什麼?顯然,你正在改變索引值。您必須提前知道這些指標值是什麼。除非你想讓它繼承它之前的行的索引值(我也會這樣)。

position = (df1.index.to_series() == ('bar', 'two')).values.argmax() 

pd.concat([ 
     df1.iloc[:position], 
     df2.set_index([['bar', 'bar'], ['one', 'one']]), 
     df1.iloc[position:] 
    ]) 

enter image description here


實施例,其中的新行從

position = (df1.index.to_series() == ('bar', 'two')).values.argmax() 
insert_idx = pd.MultiIndex.from_tuples(df1.index[[position - 1]].tolist() * len(df2)) 

pd.concat([ 
     df1.iloc[:position], 
     df2.set_index(insert_idx), 
     df1.iloc[position:] 
    ]) 
+0

@Merlin這些行(在與上述相同的結果)前述繼承索引值TRUE; s和'False's。 'argmax()'找到第一個'True'。 'argmin()'會找到第一個'False'。 – piRSquared

+0

@ Merlin Ahh,我明白你的意思了。這就是爲什麼我使用'argmax()'獲取'('bar','two')'的位置。然後我在它上面插入。仍然'argmin()'不會插入底部。它會在第一個'False'上面插入,這是第一個'('bar','one')' – piRSquared

+0

('bar','one')和argmin(),適用於我,這就是爲什麼我問 - 我沒有注意到你('酒吧','兩')。 – Merlin

相關問題