python - 针对第二个数据帧中的每一行搜索一个熊猫数据帧中的行值的快速方法
问题描述
我正在寻找优化一段代码,该代码将每一行放在一个数据帧中,并搜索这些值是否存在于第二个数据帧的任何行中。然后我将第二个数据帧行附加到一个列表中,然后附加第一个数据帧的匹配行。在第二个数据框中找不到的行不应附加到列表中,如下代码所示。
我已经编写了代码来执行此操作,但问题是它对于每个具有数百万行的较大数据帧的运行速度不够快。有什么办法可以加快这个速度吗?我尝试结合 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)
解决方案
以下显示承诺:
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”列中包含匹配的字符,因此您需要逐步完成它,但这可能会有所帮助......
推荐阅读
- mongoose - 有没有办法从另一个模式(如猫鼬)填充 Joi 中的模式?
- hyperledger-fabric - 服务发现说拒绝访问
- google-cloud-platform - Google cloud + bitnami + FTP 如何在我的 GC 上找到文件
- vb.net - 我必须使用哪个命令来清除 VB 中 PrintPreview 中的文本?
- linux - docker build 在 Ubuntu 16.04 上运行命令失败,但在 18.04 上没有相同的 Docker 版本
- javascript - 删除 Zurb Foundation 内联样式
- android - 带有 ActionCodeSettings 的 sendEmailVerification() 不发送电子邮件
- swift - 右键单击 NSTableView 行时如何添加(显示)上下文菜单?
- php - 嗨,我想通过输入类型文件传递表单数据,但我该怎么做?
- php - 查看 [partials.header] 未找到。(查看:W:\domains\iten\resources\views\layouts\master.blade.php)