我对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
我要做的第一件事就是将您的亲子关系放入字典中。然后我们可以使用replace
和merge
:
# 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