python - Python - 我应该按照我的想法迭代行吗?还是以不同的方式计划?
问题描述
我有 table1,其范围从 <100 到大约 100,000 行。它包含 22 列,其中一列是描述,其中包含我想在其中搜索一些术语的字符串。
table1
+----------+--------+--------+--------+-------------+------+-------+-------+
| UniqueId | Cat1Id | Cat2Id | Cat3Id | Col4 | Col5 | Col21 | Col22 |
+----------+--------+--------+--------+-------------+------+-------+-------+
| 1 | 123 | | 33 | Description | | | |
| 2 | 11 | 22 | | Description | | | |
| 3 | 22 | 22 | 33 | Description | | | |
| 4 | 33 | | 455 | Description | | | |
| 5 | 111 | | | Description | | | |
| | | | | | | | |
+----------+--------+--------+--------+-------------+------+-------+-------+
下面的表 2 包含我想根据 ID 在上面的 Col4 中搜索的 col Term 中的子字符串。这可以包含数百行。
table2
+--------+--------+--------+------+------+------+
| Cat1Id | Cat2Id | Cat3Id | Term | Val1 | Val2 |
+--------+--------+--------+------+------+------+
| 123 | | 33 | abc | 555 | 66 |
| 123 | | 33 | bca | 444 | 55 |
| 11 | 22 | | blah | 888 | 77 |
| 33 | | 455 | dddd | 999 | 77 |
| 33 | | 455 | aaaa | 777 | 22 |
| | | | | | |
+--------+--------+--------+------+------+------+
我需要为 table1 中的每一行保存 Val1 和 Val2。所以最后,我想要类似的东西:
table3 - final
+----------+--------+--------+--------+-------------+------+------+------+
| UniqueId | Cat1Id | Cat2Id | Cat3Id | Col4 | Term | Val1 | Val2 |
+----------+--------+--------+--------+-------------+------+------+------+
| 1 | 123 | | 33 | Description | abc | 555 | 66 |
| 1 | 123 | | 33 | Description | bca | 444 | 55 |
| 2 | 11 | 22 | | Description | blah | 888 | 77 |
| 4 | 33 | | 455 | Description | dddd | 999 | 77 |
| 4 | 33 | | 455 | Description | aaaa | 777 | 22 |
| | | | | | | | |
+----------+--------+--------+--------+-------------+------+------+------+
我的计划是这样做:
对于 table2 中的每个唯一 Cat1、2、3 组合,查询 table1 以获取包含 Cat1Id、Cat2Id、Cat3Id 的行子集。
回到 table2 并以 Term 为键, Val1 和 Val2 为值创建一个字典。
遍历上面 #1 中的行,搜索每个术语的每个描述。如果我得到一个命中,然后抓住该行,分配 Val1 和 Val2,并将所有这些数据附加到一个新的 df 中。重复。
有没有更快的方法来做到这一点?如果我有 100k 行,根据您的经验,这会变慢还是正常?几分钟的运行时间对我来说很好。
解决方案
这可能是您正在寻找的东西吗?您可能会考虑在 SO 上合并 101 以获得更多选项(Pandas Merging 101)
mrg = pd.merge(df1, df2[['Cat1Id', 'Cat2Id', 'Cat3Id','Val1', 'Val2']], how='left', left_on=[
'Cat1Id', 'Cat2Id', 'Cat3Id'], right_on=['Cat1Id', 'Cat2Id', 'Cat3Id'])
mrg.dropna()
UniqueId Cat1Id Cat2Id Cat3Id Col4 Val1 Val2
0 1 123 33 Description 555 66
1 1 123 33 Description 444 55
2 2 11 22 Description 888 77
4 4 33 455 Description 999 77
5 4 33 455 Description 777 22
推荐阅读
- node.js - 尝试解析时未显示由扩展程序生成的 HTML
- c# - Xamarin 上的 FadeIn/FadeOut 背景颜色动画
- javascript - javascript如何只比较json的键而不是值
- r - 为什么 glm 函数返回此警告:glm.fit: 拟合概率为 0 或 1
- android - React Native - 用户向下滚动足够多后,使视图出现并跟随屏幕,视图出现和消失太慢
- c# - 为事件赋值
- javascript - 反应状态反复恢复到旧值
- r - 闪亮的交互式地图中未使用的参数错误
- botframework - 如何在基于 Bot framewok v4 构建的 Teams Chatbot 中启用语音
- android - Recycler 视图 + MQTT 有时不会在数据集更改后重绘