Python Pandas基于匹配键在数据帧内复制一组单元格



我对熊猫的了解相对有限,在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中的任何其他行甚至单元格中。

我要做的第一件事是将您的父子关系放入字典中。然后我们可以使用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

最新更新