如何根据另一个数据框删除行?

时间:2020-06-11 14:42:08

标签: python pandas numpy

我已经与熊猫合作了一段时间,但我还没有弄清楚如何获得以下结果。

DF A由包含活动和非活动LOB的记录组成。我要删除不活动的LOB。但是,状态之间的非活动LOB有所不同。

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

所以,我想要一个不包含任何非活动LOB的结果DF。

ex:在OH中不活跃的LOB 78在MI中可以活跃。 推理:

在DF a中:您可以看到状态为OH且LOB为78的记录。我不希望在DF C中看到该记录,因为由于DF b的OH列中存在78,因此该记录被认为是不活动的。

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

DF A中有500k条记录。运行时间不是问题,但是如果少于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 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以使用多重索引来实现此目标,如下所示:

首先,同时使用onResponseprivate void loadNextPersons() { AWSAppSyncClient client = AppSyncClientFactory.getAppSyncClient(AppSyncAuthMode.KEY); client.query(AllPersonsByCityQuery.builder() .city(cityName) .limit(10) .nextToken(nextToken) .build()) .responseFetcher(AppSyncResponseFetchers.CACHE_AND_NETWORK).enqueue(loadCallback); } private GraphQLCall.Callback<AllPersonsByCityQuery.Data> loadCallback= new GraphQLCall.Callback<AllPersonsByCityQuery.Data>() { @Override public void onResponse(@Nonnull Response<AllPersonsByCityQuery.Data> response) { // Called twice if we have data in the cache and network connection runOnUiThread(() -> { adapter.addData(response.data().allPersonsByCity().persons()); } } } 进行索引A:

state

然后删除A中不需要的行:

LOB

A2 = A.set_index(['state', 'LOB']) 之后将仅包含所需的行。让我知道是否有帮助。