比较dataframes之间的值,并返回相应的值

问题描述:

我有两个数据帧 - df1 (800k rows) and df2 (3 rows).比较dataframes之间的值,并返回相应的值

如果df1_Adf2_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万次,我的程序的性能降低。有没有更好的方法来完成我的任务。

+0

向我们展示你的循环代码。我不知道df2_C的值应该返回给df1_C **,这意味着当你说他们有不同的长度时。 –

+0

添加了代码。这是我与我在一起的逻辑,但由于它必须迭代的循环次数而感到困惑。 –

好了,你的循环代码,转述:

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 

现在,除去外环不是很重要,因为它只能运行三次。让我们向量化内部分:

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 

我希望这是够好。请让我们知道这是多快。

让我们使用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'