【问题标题】:Compare values between dataframes and return corresponding values比较数据帧之间的值并返回相应的值
【发布时间】:2017-05-27 07:04:38
【问题描述】:

我有两个数据框 - df1 (800k rows) and df2 (3 rows).

如果df1_A的值在df2_A and df2_B之间,则df2_C的值应该返回到df1_C

for index1, row1 in df1.iterrows():
    for index2, row2 in df2.iterrows():
         if (row1['df1_A'] >= row2['df2_A']) & (row1['df1_A'] <= row2['df2_B']):
             row1['df1_C'] = row2['df2_C']

最简单易读的编写方法是使用两个 for 循环,但是因为它已经循环了大约 240 万次,所以我的程序的性能降低了。有没有更好的方法来完成我的任务。

【问题讨论】:

  • 向我们展示您的循环代码。当您说它们的长度不同时,我不知道 应将 df2_C 的值返回给 df1_C 是什么意思。
  • 添加了代码。这是我的逻辑,但由于它必须迭代的循环数量而感到困惑。

标签: python pandas join dataframe conditional-statements


【解决方案1】:

好的,你的循环代码是这样解释的:

for row1 in df1.rows:
    for row2 in df2.rows:
         if (row1.A >= row2.A) & (row1.A <= row2.B):
             row1.C = row2.C

让我们翻转循环:

for row2 in df2.rows:
    for row1 in df1.rows:
         if (row1.A >= row2.A) & (row1.A <= row2.B):
             row1.C = row2.C

现在,移除外部循环并不是很重要,因为它只运行了 3 次。让我们对内部进行矢量化:

for row2 in df2.rows:
    df1.C[(df1.A >= row2.A) & (df1.A <= row2.B)] = row2.C

并简化:

for row2 in df2.rows:
    df1.C[df1.A.between(row2.A, row2.B)] = row2.C

我希望这已经足够好了。请告诉我们这有多快。

【讨论】:

    【解决方案2】:

    让我们利用df2 仅包含三行这一事实!

    考虑以下矢量化方法:

    设置:

    df1 = pd.DataFrame(np.random.randint(100, size=(10**6, 1)), columns=['val'])
    
    df2 = pd.DataFrame({'A': {0: 1, 1: 10, 2: 20}, 'B': {0: 5, 1: 13, 2: 20}})
    

    解决方案:

    qry = ' | '.join(['{0[0]}<=val<={0[1]}'.format(r) for r in df2.values.tolist()])
    
    df1.query(qry)
    

    时间: 1.000.000 行 DF:

    In [34]: df1.shape
    Out[34]: (1000000, 1)
    
    In [35]: %timeit df1.query(qry)
    10 loops, best of 3: 46.6 ms per loop
    

    生成的查询:

    In [36]: qry
    Out[36]: '1<=val<=5 | 10<=val<=13 | 20<=val<=20'
    

    【讨论】:

      猜你喜欢
      • 2021-10-03
      • 2017-06-03
      • 2018-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多