提问者:小点点

如何删除基于另一个数据框架的行?


我已经和熊猫一起工作了一段时间,但是我还没有想出如何达到下面的结果。

DF A由包含活动和非活动LOB的记录组成。 我想移除不活动的LOB。 但非活动LOB在不同状态之间有所不同。

DF B由作为列的状态和结果列中的非活动LOB组成。

因此,我希望得到一个不包含任何非活动LOB的结果DF。

例:OH中不活跃的LOB78在MI中可能活跃。 推理:

在DF a:你可以看到一个状态为OH,LOB为78的记录。 我不希望这个记录在DF C中,因为它被认为是无效的,因为78存在于DF B中的OH列中。

在DF a中:您可以看到一个状态为MI,LOB为78的记录。 我想在我的DF C中记录,因为在DF b中的MI列中没有78

DF A中有50万条记录。 跑步时间不是问题,但如果少于5分钟就太好了。

(我从dict:[{state:[list of inactive lob]}]列表中读取DF B)

样品DF A:

Name, state, LOB, ID
a   , OH   , 66 , 7979
aa  , OH   , 78 , 12341
bas , OH   , 67 , 13434
basd, VT   , 99 , 1241234
badf, MI   , 77 , 12341234
bbdf, MI   , 78 , 12341234
caff, VT   , 66 , 2134
cdse, AZ   , 01 , 232

样品DF B:

    OH  ,  VT  ,  MI
    66  ,  99  ,  77
    78  ,  23

我想要一个DF C:

Name, state, LOB, ID
bas , OH   , 67 , 13434
bbdf, MI   , 78 , 12341234
caff, VT   , 66 , 2134
cdse, AZ   , 01 , 232

共2个答案

匿名用户

IIUC,您可以通过首先熔化dfb来执行反左联接

dfc= pd.merge(
    dfa,
    pd.melt(dfb, var_name="state", value_name="LOB"),
    on=["state", "LOB"],
    how="left",
    indicator=True,
).query('_merge != "both"').drop("_merge", axis=1)
print(dfc)

   Name state  LOB        ID
2  bas     OH   67     13434
5  bbdf    MI   78  12341234
6  caff    VT   66      2134
7  cdse    AZ    1       232

匿名用户

您可以使用多索引来实现这一点,如下所示:

首先,使用statelob索引A:

A2 = A.set_index(['state', 'LOB'])

然后删除您不希望在:

to_remove = sum([[(list(d.keys())[0], vi) for vi in list(d.values())[0]] for d in B], [])  # Assuming B is list of dictionaries as you mentioned
C = A2.loc[list(set(A2.index) - set(to_remove))]

在此之后,C将只包含所需的行。 如果有用就告诉我。