2014-03-02 68 views
2

我想兩個dataframes與偏好結合起來,在正確的離開留下數據幀的數據:如何組合數據框而不丟失數據?

我目前有:

(Pdb) pp question_struct 
    QuestionID  RowID MenuID ColumnID SourceRowID SourceColumnID SourceVariationID 
0 316926394 3029937752  0   0 3029937752    0     0 
1 316926394 3029937753  0   0 3029937753    0     0 
2 316926394 3029937754  0   0 3029937754    0     0 
3 316926394 3029937755  0   0 3029937755    0     0 
4 316926394 3029937756  0   0 3029937756    0     0 
5 316926394 3029937757  0   0 3029937757    0     0 

[6 rows x 7 columns] 
(Pdb) pp df 
    QuestionID  RowID ColumnID MenuID SourceRowID SourceColumnID SourceVariationID ResponseCount 
0 316926394 3029937753  0  0 3029937753    0     0    1 

[1 rows x 8 columns] 
(Pdb) df.combine_first(question_struct) 
    ColumnID MenuID QuestionID ResponseCount  RowID SourceColumnID SourceRowID SourceVariationID 
0  0  0 316926394    1 3029937753    0 3029937753     0 
1  0  0 316926394   NaN 3029937753    0 3029937753     0 
2  0  0 316926394   NaN 3029937754    0 3029937754     0 
3  0  0 316926394   NaN 3029937755    0 3029937755     0 
4  0  0 316926394   NaN 3029937756    0 3029937756     0 
5  0  0 316926394   NaN 3029937757    0 3029937757     0 

[6 rows x 8 columns] 

,但它正在失去question_struct 3029937752的第一行,即使它不與df中的任何內容發生衝突,並且與衝突3029937753重複。

+0

如果RowID是這些幀的索引,這將工作。 –

回答

2

combine_first只是匹配索引,而不是值(像合併會),並更新這些行中的NaNs。如果您在question_structdf的NaN中有其他列,那麼這些列將被合併到新的DataFrame中,因爲您沒有提取任何內容。

下面就來解釋一下這是怎麼回事的例子:

In [11]: df1 = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B']) 

In [12]: df2 = pd.DataFrame([[5, 6], [7, 8]], index=[1, 2], columns=['A', 'C']) 

In [13]: df1.combine_first(df2) 
Out[13]: 
    A B C 
0 1 2 NaN 
1 3 4 6 
2 7 NaN 8 

看到那5不包括在內,因爲df1已經爲第1行的列B.

的值。如果我們做的3是NaN,那麼它將使用5:

In [14]: df1.iloc[1,0] = np.nan # was a 3 

In [15]: df1.combine_first(df2) 
Out[15]: 
    A B C 
0 1 2 NaN 
1 5 4 6 
2 7 NaN 8 
+0

那麼最好的解決方案是什麼?合併? – sontek

+0

@sontek它取決於你想要發生的差異/數據差異。如果兩者相同,則使用合併,如果您希望它們在combine_first中更新,則必須使用unqiue索引對它們進行索引。 –

相關問題