0

我有 2 个大数据框,它们被认为是彼此重复的。但是,第二个数据框中有 3 个额外的行。我需要找到第一个数据帧中不存在的这 3 个额外行并将它们从第二个数据帧中删除,以便数据帧相同。这 3 行可以位于数据框中的任何位置,而不仅仅是在末尾添加。

我不知道解决这个问题的最有效方法。我尝试过使用 %in% 运算符!遍历数据中的每一列以查找不同的行,但由于有超过 100 列,这花费的时间太长。有没有人有更有效的方法来完成这样的任务?

谢谢

4

2 回答 2

0

我认为最有效的方法就是使用第一个data.frame没有那些额外行的方法。

但是,如果您需要知道它们在第二个中的位置,则可以使用以防 行data.frame是唯一的 duplicated

which(!tail(duplicated(rbind(x, y)), -nrow(x)))
#[1] 4 5

或使用interactionand %in%

which(!interaction(y) %in% interaction(x))
#[1] 4 5

或使用pasteand %in%

which(!do.call(paste, y) %in% do.call(paste, x))
#[1] 4 5

数据:

x <- data.frame(a=1:3)
y <- data.frame(a=1:5)
于 2021-06-16T09:37:41.760 回答
0

您可以使用 anti_join 方法,但在带有数据框的 pandas 中它们不存在......所以您可以使用 merge 来做到这一点:

def anti_join(x, y, on):
"""Return rows in x which are not present in y (dataframe)"""
ans = pd.merge(left=x, right=y, how='left', indicator=True, on=on)
ans = ans.loc[ans._merge == 'left_only', :].drop(columns='_merge')
return ans

如果您只想检查一列,第一种方法

def anti_join_all_cols(x, y):
    """Return rows in x which are not present in y"""
    assert set(x.columns.values) == set(y.columns.values)
    return anti_join(x, y, x.columns.tolist())

df 中所有列的第二个

返回只会给你一行 df2 NOT IN df,注意参数的方向,如果我们反转 df 和 df2 结果将不一样...

你(们)能做到 :

df_difference = anti_join_all_cols(df2,df) 

来源:https ://gist.github.com/sainathadapa/eb3303975196d15c73bac5b92d8a210f

于 2021-06-16T09:43:45.033 回答