Pandas比较DataFrame和参考DataFrame

3
我有一个DataFrame,其中包含一个无序项目ID列表及其相应的领导者。我希望将新DataFrame的值与真实情况进行比较,以验证新数据框中的所有项目ID既在基本事实中,又具有相同的领导者。有时,新的DataFrame可能有不同的列名,但它们总是两个并且始终表示相同的含义。
例如,基准真实情况DataFrame (df_gt) :
Project ID          Leader
123                Owen Wilson
122                Samuel Jackson
145                Jack Black
134                Natalie Portman

新的 DataFrame 可能为 (df_new):

Project             Leader
123                Owen Wilson
122                Henry Cavil
144                Natalie Portman
146                Jack Black

我希望得到的输出是一个列表,其中包含在新数据框中找到的所有偏差与基准真值的偏差。在这种情况下:

errors == [[122, 亨利 · 卡维尔], [144, 娜塔莉·波特曼], [146, 杰克 · 布莱克]]

有没有最简单的方法来适应多个潜在的新数据框,每个数据框都有自己的列命名约定,但具有相同的预期值。

3个回答

2
另一种解决方案是使用带有indicator=.merge
x = df1.merge(
    df2,
    left_on=["Project ID", "Leader"],
    right_on=["Project", "Leader"],
    indicator=True,
    how="right",
)

errors = (
    x.loc[x._merge.eq("right_only")]
    .apply(lambda x: [x["Project"], x["Leader"]], axis=1)
    .to_list()
)

print(errors)

输出:

[[122, 'Henry Cavil'], [144, 'Natalie Portman'], [146, 'Jack Black']]

1
谢谢!这个答案是一件艺术品。 - iby.helmy

1
df_1 = pd.DataFrame(data={'Project ID': [123, 122, 145, 134], 'Leader': ['Owen Wilson', 'Samuel Jackson',
                                                                       'Jack Black', 'Natalie Portman']})
df_2 = pd.DataFrame(data={'Project ID': [123, 122, 144, 146], 'Leader': ['Owen Wilson', 'Henry Cavil',
                                                                       'Natalie Portman', 'Jack Black']})

df_2['new'] = df_2['Project ID'].map(df_1.set_index('Project ID')['Leader'])
df_2 = df_2[(df_2['Leader']!=df_2['new'])]
print(df_2[['Project ID', 'Leader']].values.tolist())

1
假设数据框始终有两列,并且与 OP 中提到的顺序相同,我们可以使用 MultiIndex.difference 找到不匹配的行。
errs = pd.MultiIndex.from_frame(df_new)\
         .difference(pd.MultiIndex.from_frame(df_gt))

>>> list(errs)
[(122, 'Henry Cavil'), (144, 'Natalie Portman'), (146, 'Jack Black')]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接