2017-02-20 14 views
2

我有兩個數據幀,並且只想使用第二個索引尚未包含在第一個索引中的行。Concat丟失索引的兩個數據框

什麼是最有效的方法來做到這一點?

例子:

df_1 
idx  val 
0  0.32 
1  0.54 
4  0.26 
5  0.76 
7  0.23 

df_2 
idx  val 
1  10.24 
2  10.90 
3  10.66 
4  10.25 
6  10.13 
7  10.52 

df_final 
idx  val 
0  0.32 
1  0.54 
2  10.90 
3  10.66 
4  0.26 
5  0.76 
6  10.13 
7  0.23 

回顧:我需要添加的行中df_2爲其指數尚未在df_1


編輯

去掉了一些指標在df_2來說明一個事實,即從df_1各項指標不包括在df_2

回答

1

您可以通過使用數據框的combine_first方法達到想要的輸出。從方法的文檔:

組合兩個DataFrame對象,並在調用該方法的幀中默認爲非空值。結果索引列將各自的索引和列

用法示例的工會:

import pandas as pd 

df_1 = pd.DataFrame([0.32,0.54,0.26,0.76,0.23], columns=['val'], index=[0,1,4,5,7]) 
df_1.index.name = 'idx' 

df_2 = pd.DataFrame([10.56,10.24,10.90,10.66,10.25,10.13,10.52], columns=['val'], index=[0,1,2,3,4,6,7]) 
df_2.index.name = 'idx' 

df_final = df_1.combine_first(df_2) 

這將給期望的結果:

In [7]: df_final 
Out[7]: 
     val 
idx  
0  0.32 
1  0.54 
2 10.90 
3 10.66 
4  0.26 
5  0.76 
6 10.13 
7  0.23 
3

您可以使用reindexcombine_firstfillna

df = df_1.reindex(df_2.index).combine_first(df_2) 
print (df) 
     val 
idx  
0  0.32 
1  0.54 
2 10.90 
3 10.66 
4  0.26 
5  0.76 
6 10.13 
7  0.23 

df = df_1.reindex(df_2.index).fillna(df_2) 
print (df) 
     val 
idx  
0  0.32 
1  0.54 
2 10.90 
3 10.66 
4  0.26 
5  0.76 
6 10.13 
7  0.23 
+0

我沒能在明顯我的例子,但'df_2'索引並不包含所有'df_1'索引。因此,這種方法不能像現在這樣工作,它只需要出現在「df_2」中的索引。 – Jivan

+0

我嘗試測試它,對我來說它工作。您可以將它添加到樣品中哪裏存在問題?謝謝。 – jezrael

+0

運行任一解決方案時,我都有'len(df)= len(df_2)'。在'df_1'中但不在'df_2'中的索引被刪除。 – Jivan