Python Pandas根据匹配关键字在数据框中复制一组单元格

问题描述 投票:1回答:1

我对Pandas的了解相对有限,我仅凭一个小的基础+ SO的所有帮助就完成了很多工作。这是我第一次发现自己陷入死胡同。

我正在尝试找到执行以下操作的最有效方法:

我有一个〜150000行,〜40列的df。

列之一是唯一ID,其余列包含与该ID对象相对应的数据。示例:

+----+-----------+-------+-----------+------------+--------------------+
|    | UniqueID  |  CST  |  WEIGHT   |   VOLUME   |   PRODUCTIVITY     |
+----+-----------+-------+-----------+------------+--------------------+
|  1 | 413-23457 |   5   |    355    |     42     |       7894         |
|  2 | 413-20012 |   3   |    123    |     12     |       1113         |
|  3 | 413-21165 |   8   |    554    |     13     |       4536         |
|  4 | 413-24354 |   1   |    387    |     35     |       7649         |
|  5 | 413-34658 |   2   |    121    |     88     |       2468         |
|  6 | 413-36889 |   4   |    105    |     76     |       3336         |
|  7 | 413-30089 |   5   |    146    |     10     |       9112         |
|  9 | 413-41158 |   5   |    453    |     91     |       4545         |
| 10 | 413-45365 |   1   |    889    |     75     |       6748         |
| 11 | 413-51015 |   9   |    654    |     66     |       2232         |
+----+-----------+-------+-----------+------------+--------------------+

我已经确定了DF外部对象之间的合并样式关系,现在需要从“父” ID到其所有“子” ID粘贴存在该关系的数据。

如果我确定413-23457是413-20012和413-21165的父级,那么我只需要将父级中的值复制到WEIGHT,VOLUME和PRODUCTIVITY列中(而不是UniqueID或CST)即可子对象。我还确定413-41158是413-45365和413-51015的父级。结果将显示为:

+----+-----------+-------+-----------+------------+--------------------+
|    | UniqueID  |  CST  |  WEIGHT   |   VOLUME   |   PRODUCTIVITY     |
+----+-----------+-------+-----------+------------+--------------------+
|  1 | 413-23457 |   5   |    355    |     42     |       7894         |
|  2 | 413-20012 |   3   |    355    |     42     |       7894         |
|  3 | 413-21165 |   8   |    355    |     42     |       7894         |
|  4 | 413-24354 |   1   |    387    |     35     |       7649         |
|  5 | 413-34658 |   2   |    121    |     88     |       2468         |
|  6 | 413-36889 |   4   |    105    |     76     |       3336         |
|  7 | 413-30089 |   5   |    146    |     10     |       9112         |
|  9 | 413-41158 |   5   |    453    |     91     |       4545         |
| 10 | 413-45365 |   1   |    453    |     91     |       4545         |
| 11 | 413-51015 |   9   |    453    |     91     |       4545         |
+----+-----------+-------+-----------+------------+--------------------+

我必须对整个数据帧中的许多这类关联进行此操作。

我试图操纵很多示例代码以在数据帧之间进行粘贴,但是我的一些要求似乎使搜索足够有用的示例变得困难。我还可以设想一种使用.itterows()创建所有对象,然后在循环中进行相应匹配和粘贴的方法。但是,在过去的解决方案中降级到.iterrows()并指出需要花费多长时间,我认为我不能在这里应用它并为更大的数据集维持它。

任何帮助将不胜感激。

编辑:父子映射不在单独的数据框中。它们当前是循环中的关联对象(具有多个API请求以转换对象ID的类型)。例如:

for parent_id in parent_objects:
        children = get_merge(parent_id)
    for child in children:
        child_id = get_object_info(child)
        return parent_id, child_id
python pandas merge copy-paste
1个回答
0
投票

我要做的第一件事就是将您的亲子关系放入字典中。然后我们可以使用replacemerge

# create a dictionary of parent-child relationship
parent_child_dict = {}
for parent_id in parent_objects:
    children = get_merge(parent_id)
    for child in children:
        child_id = get_object_info(child)
        # update dict
        parent_child_dict[child_id] = parent_id

# parent_child_dict = {
#     '413-20012': '413-23457',
#     '413-21165': '413-23457',
#     '413-45365': '413-41158',
#     '413-51015': '413-41158'
# }

# merge and copy data back
(df.merge(df.UniqueID
           .replace(parent_child_dict),
         on='UniqueID',
         how='right')
   .set_index(df.index)
   .assign(UniqueID=df.UniqueID,
          CST=df.CST)
)

输出:

     UniqueID  CST  WEIGHT  VOLUME  PRODUCTIVITY
1   413-23457    5     355      42          7894
2   413-20012    3     355      42          7894
3   413-21165    8     355      42          7894
4   413-24354    1     387      35          7649
5   413-34658    2     121      88          2468
6   413-36889    4     105      76          3336
7   413-30089    5     146      10          9112
9   413-41158    5     453      91          4545
10  413-45365    1     453      91          4545
11  413-51015    9     453      91          4545
© www.soinside.com 2019 - 2024. All rights reserved.