我对熊猫的了解相对有限,在SO的帮助下,我在一个小小的基础上完成了很多。这是我第一次发现自己陷入了死胡同。
我正在努力寻找最有效的方法来完成以下工作:
我有一个约150000行、约40列的df。
以下是用于研究解决方案的示例数据帧:
UniqueID CST WEIGHT VOLUME PRODUCTIVITY
0 413-20012 3 123 12 1113
1 413-45365 1 889 75 6748
2 413-21165 8 554 13 4536
3 413-24354 1 387 35 7649
4 413-34658 2 121 88 2468
5 413-36889 4 105 76 3336
6 413-23457 5 355 42 7894
7 413-30089 5 146 10 9112
8 413-41158 5 453 91 4545
9 413-51015 9 654 66 2232
其中一列是唯一的ID,其余列包含与该ID的对象相对应的数据。示例:
我已经确定了DF之外的对象之间的合并样式关系,现在需要将数据粘贴到存在该关系的位置,从"父"ID到其所有"子"ID。
如果我已经确定413-23457是413-20012和413-21165的父对象,那么我只需要将WEIGHT、VOLUME和PRODUCTIVITY(但不是UniqueID或CST(列中的值从父对象复制到子对象。我还确定413-41158是413-45365和413-51015的亲本。
对于数据帧中的许多此类关联,我必须这样做。
我已经尝试过操作许多用于在数据帧之间粘贴的示例代码,但我的一些要求似乎使搜索足够有用的示例变得困难。我还可以设想一种方法,使用.itterows((创建所有对象,然后在循环中进行相应的匹配和粘贴。但是,在过去的解决方案中,我将其降级为.iterrows((,并注意到它可能需要多长时间,我认为我无法在这里应用它并在更大的数据集中维持它。
如有任何帮助,我们将不胜感激。
根据建议的解决方案编辑附加内容
如果我重新排列输入数据帧以更随机地对行进行排序,那么建议的答案并不能真正起到作用(我的错是没有更好地将实际数据集反映到这个测试样本中(。
起始数据帧为:
UniqueID CST WEIGHT VOLUME PRODUCTIVITY
0 413-20012 3 123 12 1113
1 413-45365 1 889 75 6748
2 413-21165 8 554 13 4536
3 413-24354 1 387 35 7649
4 413-34658 2 121 88 2468
5 413-36889 4 105 76 3336
6 413-23457 5 355 42 7894
7 413-30089 5 146 10 9112
8 413-41158 5 453 91 4545
9 413-51015 9 654 66 2232
目前建议的解决方案是:
parent_child_dict = {
'413-51015': '413-41158',
'413-21165': '413-23457',
'413-45365': '413-41158',
'413-20012': '413-23457'
}
(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
0 413-20012 3 387 35 7649
1 413-45365 1 121 88 2468
2 413-21165 8 105 76 3336
3 413-24354 1 355 42 7894
4 413-34658 2 355 42 7894
5 413-36889 4 355 42 7894
6 413-23457 5 146 10 9112
7 413-30089 5 453 91 4545
8 413-41158 5 453 91 4545
9 413-51015 9 453 91 4545
现在这些行是按随机顺序排列的,结果并不是预期的,我也不明白发生了什么。UniqueID为413-45365的行旨在镜像413-41158的数据,但其某些数据组合(121882468(不存在于起始DF中的任何其他行甚至单元格中。
我要做的第一件事是将您的父子关系放入字典中。然后我们可以使用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