我已经和熊猫一起工作了一段时间,但是我还没有想出如何达到下面的结果。
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
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
您可以使用多索引来实现这一点,如下所示:
首先,使用state
和lob
索引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
将只包含所需的行。 如果有用就告诉我。