Python Pandas:在同一函数调用中组合聚合列和未聚合列
我有一个DataFrame,其中有两列将在groupby(GroupBy1和GroupBy2)中使用,有几十列将使用agg()进行度量(MesA:Max、MesB:Min、MesC:sum…),其他列不用于度量,但用于诸如groupby中最后一行的日期时间、“GroupName1”、“GroupName2”、另一个数据库的GroupId等信息,等等Python Pandas:在同一函数调用中组合聚合列和未聚合列,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我有一个DataFrame,其中有两列将在groupby(GroupBy1和GroupBy2)中使用,有几十列将使用agg()进行度量(MesA:Max、MesB:Min、MesC:sum…),其他列不用于度量,但用于诸如groupby中最后一行的日期时间、“GroupName1”、“GroupName2”、另一个数据库的GroupId等信息,等等 TicketsDBFrame GroupBy1 GroupBy2 GroupName1 GroupName2 MesA MesB MesC MesD
TicketsDBFrame
GroupBy1 GroupBy2 GroupName1 GroupName2 MesA MesB MesC MesD LastTicketTime GroupId1 GroupId2
1 1 First First 2 3 1 6 2021-04-05 01:00:00 4 99
1 1 First First 4 1 3 2 2021-04-05 02:00:00 4 99
1 1 First First 2 5 2 1 2021-04-05 03:00:00 4 99
1 2 First Second 2 5 2 1 2021-04-05 01:30:00 4 75
1 2 First Second 1 4 7 3 2021-04-05 02:30:00 4 75
2 2 Second Second 4 2 1 8 2021-04-05 02:00:00 2 75
2 2 Second Second 1 6 3 1 2021-04-05 04:00:00 2 75
所需输出:
GroupBy1 GroupBy2 GroupName1 GroupName2 MesA MesB MesC MesD LastTicketTime GroupId1 GroupId2
1 1 First First 4 1 6 9 2021-04-05 03:00:00 4 99
1 2 First Second 2 4 4 2 2021-04-05 02:30:00 4 75
2 2 Second Second 4 2 4 9 2021-04-05 04:00:00 2 75
我已经知道如何使用派生数据帧创建此所需的帧,使用'loc'和'idxmax'获取帧中的LastTicketTime,其他派生帧获取'Ids and Names',另一个DataFrame调用度量列的agg(),然后在帧中进行合并
groupInfoFrame:将GroupBy1-GroupName1-GroupId1关联起来创建的小派生框架
lastTicketFrame:仅包含LastTicketTime的帧
lastTicketFrame=TicketsDBFrame[['GroupBy1','GroupBy2','LastTicketTime' ]]
lastTicketFrame=lastTicketFrame.loc[lastTicketFrame.groupby(['GroupBy1'],['GroupBy2]).LastTicketTime.idxmax() ]
度量框架:仅度量
measuresFrame = TicketsDBFrame.groupby(['GroupBy1'],['GroupBy2]).agg( mesA:.....MesD )
毕竟,我在MeasureName和lastTicketFrame中使用GroupBy1和GroupBy2作为键进行合并
是否可以在一个agg()或transform()或其他函数调用中包含所有这些信息?没有派生帧和合并您可以在单个
agg
中执行该操作(通过按lastticketime
对值进行排序,并在agg
中取last
):
输出:
GroupBy1 GroupBy2 GroupName1 GroupName2 MesA MesB MesC MesD \
0 1 1 First First 4 1 6 9
1 1 2 First Second 2 4 9 4
2 2 2 Second Second 4 2 4 9
LastTicketTime GroupId1 GroupId2
0 2021-04-05 03:00:00 4 99
1 2021-04-05 02:30:00 4 75
2 2021-04-05 04:00:00 2 75
另外,如果我没有弄错的话,GroupName1=First,GroupName2=Second的预期输出似乎有问题:
MesC
和MesD
是总和,应该分别是9和4(而不是4和2)。非常感谢您,perl。这比我以前做的容易多了
GroupBy1 GroupBy2 GroupName1 GroupName2 MesA MesB MesC MesD \
0 1 1 First First 4 1 6 9
1 1 2 First Second 2 4 9 4
2 2 2 Second Second 4 2 4 9
LastTicketTime GroupId1 GroupId2
0 2021-04-05 03:00:00 4 99
1 2021-04-05 02:30:00 4 75
2 2021-04-05 04:00:00 2 75