列表理解和速度优化

时间:2019-09-30 12:38:16

标签: python pandas

我有一个熊猫数据框,在该数据框内,我有两个系列/列,我希望合并成一个新的系列/列。我已经有一个for循环,可以满足我的需要,但我希望它可以包含在列表理解中,但我无法弄清楚。另外,我的代码需要花费大量时间才能执行。我读到列表理解的运行速度更快,也许有更快的方法吗?

如果“ lead_owner”中的值与“ agent_final”中的不同/唯一值匹配,则使用该值。否则,请使用'agent_final'中的值

for x, y in zip(list(df['lead_owner']), list(df['agent_final'])):
    if x in set(df['agent_final']):
        my_list .append(x)
    else:
        my_list .append(y)

4 个答案:

答案 0 :(得分:2)

使用列表推导的方法:

my_list = [x if x in set(df['agent_final']) else y for (x,y) in zip(list(df['lead_owner']), list(df['agent_final']))]

很难说出代码运行缓慢的原因,除非我知道数据的大小。

确保代码加速的一种方法是,每次检查x是否在集合中时都不要构造集合。在for循环/列表理解之外构造集合:

agent_final_set = set(df['agent_final'])
my_list = [x if x in agent_final_set else y for (x,y) in zip(list(df['lead_owner']), list(df['agent_final']))]

答案 1 :(得分:1)

我删除了一些不必要的代码,并提取了主循环集 outside 的创建。让我们看看它是否运行得更快:

agents = set(df['agent_final'])
data = zip(df['lead_owner'], df['agent_final'])
result = [x if x in agents else y for x, y in data]

答案 2 :(得分:1)

我建议您尝试熊猫apply并分享效果:

agents = set(df['agent_final'])
df['result'] = df.apply(lambda x: x['lead_owner'] if x['lead_owner'] in agents else x['agent_final'], axis=1)

并根据需要执行to_list

答案 3 :(得分:0)

使用numpy.where单线:

my_list = np.where(df.lead_owner.isin(df.agent_final), df.lead_owner, df.agent_final)

简单的例子:

In [284]: df
Out[284]: 
  lead_owner agent_final
0          a           1
1          b           2
2          c           a
3          e           c

In [285]: np.where(df.lead_owner.isin(df.agent_final), df.lead_owner, df.agent_final)
Out[285]: array(['a', '2', 'c', 'c'], dtype=object)