首页 > 解决方案 > Groupby 按日期排序,根据其他列值找到最小值、最大值

问题描述

我 40 天前开始学习熊猫。我只知道熊猫基础功能。

我有一个如下所示的数据框。

    ID  Status  Date    Cost
0   1   F   2017-06-22  500
1   1   M   2017-07-22  100
2   1   P   2017-10-22  100
3   1   F   2018-06-22  600
4   1   P   2018-08-22  150
5   1   F   2018-10-22  120
6   1   F   2019-03-22  750
7   2   M   2017-06-29  200
8   2   F   2017-09-29  600
9   2   F   2018-01-29  500
10  2   M   2018-03-29  100
11  2   P   2018-08-29  100
12  2   M   2018-10-29  100
13  2   F   2018-12-29  500
14  3   M   2017-03-20  300
15  3   F   2018-06-20  700
16  3   P   2018-08-20  100
17  3   M   2018-10-20  250
18  3   F   2018-11-20  100
19  3   P   2018-12-20  100
20  3   F   2019-03-20  600
22  4   M   2017-08-10  800
23  4   F   2018-06-10  100
24  4   P   2018-08-10  120
25  4   F   2018-10-10  500
26  4   M   2019-01-10  200
27  4   F   2019-06-10  600
31  7   M   2017-08-10  800
32  7   F   2018-06-10  100
33  7   P   2018-08-10  20
34  7   F   2018-10-10  500
35  7   F   2019-01-10  200

数据集根据 ID 和 Date 进行排序。

请注意,所有 ID 中的 Last Status 均为 F。

从上面的数据框我想准备下面的数据框。

ID  SLS Cost@SLS  Min_Cost  Max_Cost  Avg_Cost
1   F   120       100       600       261.67
2   M   100       100       600       266.67
3   P   100       100       700       258.33
4   M   200       100       800       344.00
7   F   500       20        800       360.00

SLS = 倒数第二个状态

请注意,Min、Max 和 Avg Cost 的计算没有考虑每个 ID 的最后一行。

并从此替换 Cost@SLS = 1000,如果 SLS == F

预期的数据帧如下所示。

ID  SLS Cost@SLS  Min_Cost  Max_Cost  Avg_Cost
1   F   1000       100       600       261.67
2   M   100       100       600       266.67
3   P   100       100       700       258.33
4   M   200       100       800       344.00
7   F   1000       20        800       360.00

标签: pythonpandaspandas-groupby

解决方案


这是稍微修改 piR 的答案的一种方法

s=df[df.ID.duplicated(keep='last')].groupby('ID').agg({'Status': ['last'], 'Cost': [ 'last','min', 'max', 'mean']})
s.loc[s[('Status','last')]=='F',('Cost','last')]=1000
s
   Status  Cost                      
     last  last  min  max        mean
ID                                   
1       F  1000  100  600  261.666667
2       M   100  100  600  266.666667
3       P   100  100  700  258.333333
4       M   200  100  800  344.000000
7       F  1000   20  800  355.000000

推荐阅读