【问题标题】:Do I need the left table indexed for efficiency when left merging with another indexed DataFrame?当与另一个索引的 DataFrame 合并时,我是否需要索引左表以提高效率?
【发布时间】:2020-05-04 06:22:19
【问题描述】:

我想做一个leftmerge加入两个pandas DataFrame:

merged_df = left_df.merge(right_df, how='left', left_on='id', right_index=True)

left_df 没有被索引,它只有一个id,但right_df 索引。 我没有索引left_df,因为它不断变化,但是如果左侧DataFrame也被索引,合并会更快吗?在我的情况下,合并非常频繁,直到现在左侧DataFrames最多有 60k 行,最多有 1000 行。

我还没有检查 pandas 的 merge 代码,但是由于在左侧合并中它保留了左侧 DataFrame 的所有行,我不确定索引它是否会提高此合并的速度。

【问题讨论】:

    标签: pandas dataframe join indexing


    【解决方案1】:

    让我们用假数据来测试一下吧:

    import pandas as pd
    import numpy as np
    
    # df1: 60k rows, not indexed
    df1 = pd.DataFrame(data = {'a': np.random.randint(0, 100, 60_000),
                               'b': np.random.randint(0, 100, 60_000)})
    # df2: 1k rows, indexed
    df2 = pd.DataFrame(data = {'c': np.random.randint(0, 100, 1000)},
                       index =  np.random.randint(0, 100, 1000))
    

    参加演出

    %timeit pd.merge(df1, df2, left_on='a', right_index=True, how='left')
    55.4 ms ± 6.04 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
    
    %timeit pd.merge(df1.set_index('a'), df2, left_index=True, right_index=True, 
    how='left')
    49.8 ms ± 3.13 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
    

    这在加入索引时已经显示出更好的性能。但是,我还在连接中设置索引,如果您有多个连接,则只需执行一次。让我们看看这两个操作之间的时间划分:

    %time df1.set_index('a', inplace=True)
    Wall time: 936 µs
    
    %timeit pd.merge(df1, df2, left_index=True, right_index=True, how='left')
    48 ms ± 3.13 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-28
      • 2016-02-17
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多