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



我很难用语言表达我想要做的事情(为通用标题道歉(,所以我将首先显示代码:

我有这个数据帧";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)

根据这个数据帧,我需要基于两个条件创建一个新的数据帧:首先,我有一个名为"的电子邮件列表;电子邮件";在数据帧"中;匹配";用于从数据帧"中选择行;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])]

第二个条件是在我的原始数据帧"0"中是否存在行;mydf";其中";"滤波器代码";处于";代码";我的新数据帧的";out";如果是这种情况,请附加它:

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

这产生了预期的数据帧,该数据帧包含来自原始数据帧的行0和2。如果我过滤了";test2@gmail.com"它应该只在数据帧"1"中显示行1;输出";。

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

使用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

最新更新