代码之家  ›  专栏  ›  技术社区  ›  Chopin

快速绘制值的方法-熊猫

  •  0
  • Chopin  · 技术社区  · 4 年前

    我有一个df( df1 )包含不超过10行的。它显示两个引用列( Val1, Val2 )还有第三列( Item )代表一个重要的字符串。我有第二个数据帧,它包含相同的引用列( 谷1,谷2 )但超过500万排。我想要地图 项目 以有效的方式从初始df到第二数据帧。

    我试过了 merge 或者设置索引并使用 join . Dask 也没有加快进程。有没有一个单独的方法可以代替合并/连接两个数据帧?

    df1 = pd.DataFrame({  
        'Val1' : [1.0,1.0,2.0,2.0],    
        'Val2' : ['Red','Blue','Red','Blue'],       
        'Item' : ['Up','Down','Down','Up'],                                  
        })
    
    df2 = pd.DataFrame({  
        'Val1' : [1.0,1.0,1.0,1.0,2.0,2.0,2.0,2.0],  
        'Val2' : ['Red','Blue','Red','Blue','Red','Blue','Red','Blue'],                                      
        })
    
    df1.set_index(['Val1','Val2'], inplace=True)
    df2.set_index(['Val1','Val2'], inplace=True)
    
    df_final = df2.join(df1, how = 'left').reset_index()
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   Arturo Sbr    4 年前

    以我的经验,整数键会导致更快的合并时间。为此,您可以映射 Val1 Val2 两个数据帧上的整数( df1 df2 )然后合并 瓦尔1 .

    我相信有更有效的方法来绘制地图 瓦尔1 Val2型 但这个答案的目的是为了说明在整数上合并更快。

    # Turn Val1 and Val2 to categorical dtypes
    df2[['Val1','Val2']] = df2[['Val1','Val2']].apply(lambda x: pd.Categorical(x))
    # Turn categories to dictionaries
    d1 = dict(enumerate(df2['Val1'].cat.categories))
    d2 = dict(enumerate(df2['Val2'].cat.categories))
    # Reverse keys and values in each dictionary
    d1 = {v:k for k,v in d1.items()}
    d2 = {v:k for k,v in d2.items()}
    # Replace columns in df1
    df1['Val1'].replace(d1, inplace=True)
    df2['Val1'].replace(d1, inplace=True)
    df1['Val2'].replace(d2, inplace=True)
    df2['Val2'].replace(d2, inplace=True)
    # Merge by integer versions of Val1 and Val2
    df2.merge(df1, on=['Val1','Val2'], how='left')
    

    # Merge with original keys
    start = time.time()
    df2.merge(df1, on=['Val1','Val2'], how='left')
    round(time.time() - start, 5)
    
    0.00672
    
    # Merge with integer keys
    start = time.time()
    df2.merge(df1, on=['Val1','Val2'])
    round(time.time() - start, 5)
    
    0.00485