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
我试图在我的数据集中巩固一对多关系,同时为每个项目(有时是多个项目)创建 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