2016-06-13 151 views
0

我有兩個pandas.DataFrame s的重疊列和指數,等如何從另一個DataFrame填充DataFrame,添加行並替換空值?

X = pandas.DataFrame({"A": ["A0", "A1", "A2"], "B": ["B0", None, "B2"]}, 
        index=[0, 1, 2]) 
Y = pandas.DataFrame({"A": [V, "A3"], "B": ["B1", "B3"], "C": ["C1", "C3"]}, 
        index=[1, 3]) 

我想由值Y,徘徊無論數據丟失延長X,保持相同的列。也就是說

  1. 如果V=="A1"pandas.isnull(V),我想獲得

    >>> X.fill_from(Y) 
        A  B 
    0 A0 B0 
    1 A1 B1 
    2 A2 B2 
    3 A3 B3 
    

    B1已從Y充滿因爲以前的值,None,是大熊貓空值的值。已添加行3,因爲該行中的所有值都未在X中給出,因爲X沒有此行。

  2. 如果V!="A1",我想得到關於數據幀包含不兼容數據這一事實的異常。

如果我確信我的數據沒有丟失的數據,pandas.concat((X, Y), join_axes=[X.columns])會做擴展,並DataFrame.index.get_duplicates()會告訴我,如果有誤匹配的行。

困難的部分是確保數據丟失不採取從目前的數據不同,但可以填寫,我不看怎麼做纔不至於迭代中get_duplicates()每一個可能的對,手動複製數據。

This question with a similar title是沒有真正相關的。使用X[X.isnull()] = Y(如this other question)不適用於get_duplicates()錯誤匹配檢查。

+1

只是略讀,但你有沒有嘗試'combine_first'? – IanS

+0

'combine_first'看起來非常適合匹配數據,謝謝。現在我需要看看如何獲​​取不匹配數據的錯誤(因爲比較數據幀也不明顯)。 – Anaphory

+0

由於@IanS建議你可以調用'combine_first'' X.combine_first(Y)[['A','B']]'來實現你想要的結果 – EdChum

回答

0

combine_first方法是交易的一半,這要感謝@IanS指出。

>>> X.combine_first(Y)[list(X.columns)] 
    A B 
0 A0 B0 
1 A1 B1 
2 A2 B2 
3 A3 B3 

現在,如果V是好的,我們應該得到相同的結果時combine_first在另一個方向ING,否則我們會得到不同的東西。並且因爲NaN s不比較好,整個功能是

def combine_first_if_matching(X, Y): 
    filled = X.combine_first(Y)[list(X.columns)] 
    reverse_filled = Y.combine_first(X)[list(X.columns)] 
    if ((filled == reverse_filled) | (filled.isnull())).all().all(): 
     return filled 
    else: 
     raise ValueError("Overlap of data frames did not match") 
相關問題