2016-06-13 97 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") 
相关问题