pandas:根据两个条件创建数据框(我的解决方案是最优的吗?)

pandas: create dataframe based on two conditions (is my solution optimal?)

我很难用语言表达我正在尝试做的事情(为通用标题道歉)所以我先展示代码:

我有这个数据框“mydf”:

import pandas as pd
d = {'email': ['test1@gmail.com', 'test2@gmail.com', None], 'code':[100, 101, 102], 'filtercode':[None, None, 100]}
mydf=pd.DataFrame(data=d)

根据这个数据框,我需要根据两个条件创建一个新的数据框:首先,我在数据框“匹配”中有一个名为“电子邮件”的电子邮件列表,用于 select 来自数据框的行"mydf".

emails={'email':['test1@gmail.com']}
match=pd.DataFrame(data=emails)
out = mydf[mydf['email'].isin([x for sublist in match.values.tolist() for x in sublist])]

第二个条件是在我的原始数据框“mydf”中是否有一行,其中“filtercode”在我的新数据框“out”的“代码”中,如果是的话,附加它:

out = out.append(mydf[mydf['filtercode'].isin(out['code'])])

这会产生预期的数据帧,其中包含原始数据帧的第 0 行和第 2 行。如果我按“test2@gmail.com”过滤,它应该只显示数据框“out”中的第 1 行。

现在,我是 pandas 的新手,这段代码有效,但我想知道这是否是最优雅的解决方案,或者是否有更简单的方法来执行此操作。感觉我的解决方案有点笨拙,也许有一种方法可以一次完成这两个步骤,而不是先创建输出数据帧,然后从原始数据帧追加行。如有任何反馈,我们将不胜感激!

第一步可以使用 merge 更优雅地完成。与第二步关系不大,虽然我们可以将这两个步骤合二为一:

df1 = mydf.merge(match.assign(matched = True), how = 'left', on = 'email')
out = df1[(df1['matched'] == True) | (df1['filtercode'].isin(mydf['code']))]

out 看起来像这样:

    email              code    filtercode    matched
--  ---------------  ------  ------------  ---------
 0  test1@gmail.com     100           nan          1
 2                      102           100        nan