Groupby 并在具有一对多关系的多个列上应用函数

Groupby and Apply Functions on multiple Columns with 1-to-many relationship

我试图在我的数据集中巩固一对多关系,同时为每个项目(有时是多个项目)创建 link。对于给定的工单,可以有 1 个或多个工单,因此我使用以下方法在单个列中合并和列出工单:

df = df.groupby(['Date', 'Ticket ID', 'Score', 'many other Columns...'])['Work Order'].apply(', '.join).reset_index()

这给了我一个很好的输出,其中工单单独列出或以逗号分隔,如下所示:

Date                        Ticket ID           Work Order
2018-08-30 22:52:25         1444008             119846184
2021-09-29 13:33:49         1724734             122445397, 122441551

现在,我想为工单创建 links,它们也是以逗号分隔的。对于单个工单,以下工作正常:

woLink = r'www.google.com/woNum='
df['WO Link'] = woLink + df['Work Order'].astype(str)

然而,对于多个,它基本上撤消了 groupby 并重新添加我分组的行。从上面的示例数据中,如:

# Wrong
Date                        Ticket ID           Work Order           Link
2018-08-30 22:52:25         1444008             119846184            google.com/woNum=119846184
2021-09-29 13:33:49         1724734             122445397            google.com/woNum=122445397
2021-09-29 13:33:49         1724734             122441551            google.com/woNum=122441551

我想要的是:

Date                        Ticket ID           Work Order           Link (s)
2018-08-30 22:52:25         1444008             119846184            google.com/woNum=119846184
2021-09-29 13:33:49         1724734             122445397, 122441551 google.com/woNum=122445397, google.com/woNum=122441551

我已经尝试了 Groupby/apply 的几种不同变体,例如重组但没有成功:

df = df.groupby(['Date', 'Ticket ID', 'Score', 'many other Columns...'])['Link'].apply(', '.join).reset_index()

它似乎总是再次重复该行 - 我知道这是因为 WO 和 WOLink 都有一个 1 到许多,但我似乎无法弄清楚如何同时处理这两个。

如何分组并合并此数据框?

您可以使用正则表达式添加 URL 部分:

woLink = r'example.org/woNum='
df['Link'] = df['Work Order'].str.replace('(\d+)', rf'{woLink}')

输出:

                  Date  Ticket ID            Work Order                                                      Link
0  2018-08-30 22:52:25    1444008             119846184                               example.org/woNum=119846184
1  2021-09-29 13:33:49    1724734  122445397, 122441551  example.org/woNum=122445397, example.org/woNum=122441551