首页 > 解决方案 > 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 |
|          |        |        |        |             |      |      |      |
+----------+--------+--------+--------+-------------+------+------+------+

我的计划是这样做:

  1. 对于 table2 中的每个唯一 Cat1、2、3 组合,查询 table1 以获取包含 Cat1Id、Cat2Id、Cat3Id 的行子集。

  2. 回到 table2 并以 Term 为键, Val1 和 Val2 为值创建一个字典。

  3. 遍历上面 #1 中的行,搜索每个术语的每个描述。如果我得到一个命中,然后抓住该行,分配 Val1 和 Val2,并将所有这些数据附加到一个新的 df 中。重复。

有没有更快的方法来做到这一点?如果我有 100k 行,根据您的经验,这会变慢还是正常?几分钟的运行时间对我来说很好。

标签: pythonpandasloops

解决方案


这可能是您正在寻找的东西吗?您可能会考虑在 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

推荐阅读