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
我很难用语言表达我正在尝试做的事情(为通用标题道歉)所以我先展示代码:
我有这个数据框“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