如何从另一个DataFrame填充DataFrame,添加行并替换null



我有两个具有重叠列和索引的pandas.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在panda中是空值。添加了行3,因为该行中的所有值都没有在X中给定,因为X没有这样的行。

  2. 如果是V!="A1",我想得到一个关于数据帧包含不兼容数据这一事实的异常。

如果我确定我的数据没有丢失的数据,pandas.concat((X, Y), join_axes=[X.columns])会进行扩展,DataFrame.index.get_duplicates()会告诉我是否存在不匹配的行。

最困难的部分是确保丢失的数据不会被视为与当前数据不同,而是可以被填充,如果不迭代get_duplicates()中的每一个可能的对并手动复制数据,我看不出如何做到这一点。

这个标题相似的问题实际上并不相关。与其他问题一样,使用X[X.isnull()] = Y不适用于get_duplicates()错误匹配检查。

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朝另一个方向时,我们应该得到相同的结果,否则我们会得到不同的结果。因为NaN的比较不好,所以整个功能是

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")

最新更新