【问题标题】:List Comprehension & Speed Optimization列表理解和速度优化
【发布时间】:2019-09-30 12:38:16
【问题描述】:

我有一个 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)

【问题讨论】:

  • 你试过了吗df['concatenated_col'] = df['lead_owner'] + df['agent_final']
  • 看起来您希望交叉点添加代理列表。看看这个:SO Answer
  • 我不希望它们串联。如果“lead_owner”中的值与“agent_final”中的不同/唯一值匹配,则使用该值。否则使用“agent_final”中的值。
  • 你能发布一些示例数据吗?

标签: python pandas


【解决方案1】:

使用列表推导的方法:

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']))]

【讨论】:

  • 这工作谢谢!在关闭 zip() 的末尾缺少一个圆括号
【解决方案2】:

我删除了一些不必要的代码并提取了主循环的集合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]

【讨论】:

    【解决方案3】:

    我建议你试试 pandas 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

    【讨论】:

      【解决方案4】:

      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)
      

      【讨论】:

        猜你喜欢
        • 2012-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-01
        • 2016-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多