我有一个熊猫数据框,在该数据框内,我有两个系列/列,我希望合并成一个新的系列/列。我已经有一个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)
答案 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)