我有两个具有重叠列和索引的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
,只要数据丢失,就保持相同的列。那是
如果是
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
没有这样的行。如果是
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")