首页 > 解决方案 > 针对第二个数据帧中的每一行搜索一个熊猫数据帧中的行值的快速方法

问题描述

我正在寻找优化一段代码,该代码将每一行放在一个数据帧中,并搜索这些值是否存在于第二个数据帧的任何行中。然后我将第二个数据帧行附加到一个列表中,然后附加第一个数据帧的匹配行。在第二个数据框中找不到的行不应附加到列表中,如下代码所示。

我已经编写了代码来执行此操作,但问题是它对于每个具有数百万行的较大数据帧的运行速度不够快。有什么办法可以加快这个速度吗?我尝试结合 itertuples 和其他方法来加快搜索速度,但它仍然运行缓慢。

这是第一个数据框的样子:

在此处输入图像描述

这就是第二个数据框的样子:

在此处输入图像描述

下面的代码按照所描述的逻辑生成的最终数据帧如下所示。如您所见,(列名)“索引”1 处的第一个数据帧与第二个数据帧不共享任何值,并且在其下方的索引位置中没有来自第二个数据帧的行,而(列名)“索引”2 找到与第二个数据框中的最后一行匹配:

在此处输入图像描述

import pandas as pd 
import numpy as np

df1 = pd.DataFrame({"A": ["a", "b", "c", "d"], "B": ["e", "f", "g", "h"], "C": ["z", "l", "r", "s"], "index": [1, 2, 3, 4]})
df2 = pd.DataFrame({"A": ["q", "r", "c", "b"], "B": ["a", "b", "c", "d"], "C": ["g", "g", "g", "g"]})

g = []
for row in df1.itertuples():
    g.append(df1.loc[[row.Index]])
    g.append(df2.loc[
        
        (df2.A.values == row.A) |
        (df2.B.values == row.B) |
        (df2.C.values == row.C)
        
    ])
pd.concat(g)

标签: pythonpandasdataframeloopssearch

解决方案


以下显示承诺:

import pandas as pd 
import numpy as np

df1 = pd.DataFrame({"A": ["a", "b", "c", "d"], "B": ["e", "f", "g", "h"], "C": ["z", "l", "r", "s"], "index": [1, 2, 3, 4]})
df2 = pd.DataFrame({"A": ["q", "r", "c", "b"], "B": ["a", "b", "c", "d"], "C": ["g", "g", "g", "g"]})

combined_df = df1.append(df2[df2.A.isin(df1.A) | df2.B.isin(df1.B) | df2.C.isin(df1.C)])

   A  B  C  index
0  a  e  z    1.0
1  b  f  l    2.0
2  c  g  r    3.0
3  d  h  s    4.0
2  c  c  g    NaN
3  b  d  g    NaN

我还没有在大型 DF 上对此进行测试,并且您的测试数据目前仅在“A”列中包含匹配的字符,因此您需要逐步完成它,但这可能会有所帮助......


推荐阅读