python - 遍历两个数据帧并创建一个字典,一个数据帧是在第二个数据帧(值)中找到的字符串中的子字符串
问题描述
我有两个数据框。一个非常大,有超过 400 万行数据,而另一个大约有 26k。我正在尝试创建一个字典,其中键是较小数据框的字符串。此数据框(df1)包含子字符串或不完整的名称,而较大的数据框(df2)包含全名/字符串,我想检查 df1 中的子字符串是否在 df2 中的字符串中,然后创建我的 dict。
无论我尝试什么,我的代码都需要很长时间,我一直在寻找更快的方法来迭代 df。
org_dict={}
for rowi in df1.itertuples():
part = rowi.part_name
full_list = []
for rowj in df2.itertuples():
if part in rowj.full_name:
full_list.append(full_name)
org_dict[part]=full_list
我错过了休息时间还是有更快的方法来遍历超过 100 万行的非常大的数据帧?
样本数据:
df1
part_name
0 aaa
1 bb
2 856
3 cool
4 man
5 a0
df2
full_name
0 aaa35688d
1 coolbbd
2 8564578
3 coolaaa
4 man4857684
5 a03567
预期输出:
{'aaa':['aaa35688d','coolaaa'],
'bb':['coolbbd'],
'856':['8564578']
...}
ETC
解决方案
这里的问题是,随着数据的增长,嵌套的 for 循环在时间上的表现非常糟糕。幸运的是,pandas 允许我们跨行/列执行向量化操作。
如果无法访问您的数据样本,我无法正确测试,但我相信这可以解决问题并且执行速度更快:
org_dict = {substr: df2.full_name[df2.full_name.str.contains(substr)].tolist() for substr in df1.part_name}
推荐阅读
- node.js - 有一种方法可以在 MongoDB 中强制执行引用完整性
- android - 如何在 android studio 设备模拟器中模拟来自“不可用”的电话?
- sql - 如何访问大查询表中列内的数据数组的列名?
- java - java.lang.ExceptionInInitializerError 引起:com.fasterxml.jackson.databind.JsonMappingException:Jackson 版本太旧 2.5.1
- r - 根据总和选择列
- python - 批量更新的 Welford 方差/标准算法的公式是什么?
- google-apps-script - 在两个电子表格之间查找一行,然后查找包含第一行中的值的行
- java - 如何在 JFROG 上上传带有目录的 jar 文件?
- android - 使用 addImage() 和会话优化 ArCore Fragment 导航
- python - UnboundLocalError:分配前引用的局部变量“var”