如何基于另一个数据帧删除行?

2024-09-28 22:25:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经和熊猫一起工作了一段时间,但我还没有想出如何实现以下结果

DFA由包含活动和非活动LOB的记录组成。我想删除不活动的LOB。但各州之间的非活动LOB有所不同

DF B由列形式的状态和结果列中的非活动LOB组成

因此,我想要一个不包含任何非活动LOB的结果DF

例:OH中不活跃的LOB 78可能在MI中活跃。 理由:

在dfa中:您可以看到一条状态为OH和lob78的记录。我不希望此记录出现在DF C中,因为DF b中的OH列中存在78条记录,因此它被视为非活动记录

在dfa中:您可以看到状态为MI和lob78的记录。我希望记录在我的DF C中,因为DF b的MI列中没有78

DFA中有500k记录。运行时间不是问题,但如果少于5分钟就好了

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

样本DFA:

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

Tags: nameiddf状态记录oh样本state
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], [])  # If we use the list dictionaries without converting it to DataFrame
C = A2.loc[list(set(A2.index) - set(to_remove))]

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

相关问题 更多 >