Python 从其他两个数据帧的元素创建数据帧

Python 从其他两个数据帧的元素创建数据帧,python,pandas,Python,Pandas,下面的代码工作得很好。它通过比较其他两个数据帧中的元素并对其进行过滤来创建数据帧 import pandas as pd df1 = pd.DataFrame({'i': [40, 40, 40, 41, 41], 'j': [140, 140, 140, 141, 142], 'k' : [140, 141, 142, 141, 142], 'avg': [33, 31,

下面的代码工作得很好。它通过比较其他两个数据帧中的元素并对其进行过滤来创建数据帧

import pandas as pd

df1 = pd.DataFrame({'i': [40, 40, 40, 41, 41],
                    'j': [140, 140, 140, 141, 142],
                    'k' : [140, 141, 142, 141, 142],
                    'avg': [33, 31, 30, 33, 29]})

df2 = pd.DataFrame({'i': [10, 40, 10, 41, 21, 11],
                    'j': [110, 140, 110, 141, 122, 111],
                    'k' : [110, 141, 142, 141, 122, 111],
                    'avg': [31, 30, 40, 31, 25, 29]})

offset = abs(df1.loc[0,'i'] - df2.loc[0,'i'])

df3 = pd.DataFrame(columns=["i_ref", "j_ref", "k_ref", "i_sim", "j_sim", "k_sim", "avg_ref", "avg_sim", "deviation [%]"])
for row1 in df1.itertuples():
    for row2 in df2.itertuples():
        if (abs(row1.i - row2.i) == offset) & (abs(row1.j - row2.j) == offset) & (abs(row1.k - row2.k) == offset):
            df3 = df3.append({
            "i_ref": row1.i,
            "j_ref": row1.j,
            "k_ref": row1.k,
            "i_sim": row2.i,
            "j_sim": row2.j,
            "k_sim": row2.k,
            "avg_ref": row1.avg,
            "avg_sim" : row2.avg,
            "deviation [%]" : abs(row1.avg-row2.avg)*100/row1.avg
            }, ignore_index=True)
然而,在我的实际案例中,df1和df2各有100万个条目(从csv文件读取),计算将永远花费时间


我的问题:有没有更有效的方法来达到同样的结果?

一个可能有助于提高效率的方法是一次比较一个条件;如果它不满足第一个条件,那么继续,而不是每次迭代都尝试这三个条件。我对您输入的一个组合(合并的df1和df2)进行了测试,发现
[abs(df4[f'{item}{ux']-df4[f'{item}}{uy']==在['I']].
中运行
487µs
[abs(df4[f'{item}}{ux']-df4[f'{item}{uy']==在['I'、'j'、'k'中运行的偏移量]
1.34毫秒运行
一件可能有助于提高效率的事情是一次比较一个条件;如果它不满足第一个条件,那么继续,而不是每次迭代都尝试这三个条件。我测试了您输入的一个组合(合并的df1和df2),发现
[abs(df4[f'{item}{ux']-df4[f'{item}}{uy']==在['I']].
中运行
487µs
[abs(df4[f'{item}{ux']-df4[f'{item}{uy'])==在['I'、'j'、'k']中运行