按总和,计数和模式分组

时间:2019-07-10 11:10:51

标签: pandas pandas-groupby

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

   ID Status  Date      Cost
0   1   F   22-Jun-17   500
1   1   M   28-Jul-17   100
2   2   M   29-Jun-17   200
3   3   M   30-Mar-17   300
4   4   F   10-Aug-17   800
5   2   F   2-Sep-17    600
6   2   F   5-Jan-18    500
7   1   F   23-Jun-18   600
8   3   F   20-Jun-18   700
9   1   M   20-Aug-08   150
10  1   F   20-Mar-19   750
11  3   M   11-Feb-19   250
12  4   M   11-Jun-18   100

这是手机的维修数据。 其中F-失败,M-维护。 我是大熊猫新手。 我想查找每个ID的总费用,每个ID的F数量,每个ID的M数量,该ID基于日期的第一状态。最后状态,失败的总费用。

我的预期结果如下所示

   ID Ttl_cost  No_of_F No_of_M F_cost  First_Status    Last_status
0   1   2100     3        2     1850       F                F
1   2   1300     2        1     1100       M                F
2   3   1250     1        2     700        M                M
3   4   900      1        1     800        F                M
​

1 个答案:

答案 0 :(得分:2)

首先将列转换为日期时间,然后按DataFrame.sort_values进行排序,然后针对IDGroupBy.aggGroupBy.first,按sum列的Multiindex列进行汇总。用mapjoinsum展平。然后将GroupBy.last用于size,将df['Date'] = pd.to_datetime(df['Date'], format='%d-%b-%y') df = df.sort_values('Date') df2 = df.groupby('ID').agg({'Cost':['sum'], 'Status':['first','last']}) df2.columns = df2.columns.map('_'.join) df3 = df.pivot_table(index='ID', columns='Status', values='Cost', aggfunc=['sum','size']) df3 = df3.rename(columns={'size':'No_of', 'sum':'Cost'}) df3.columns = df3.columns.map('_'.join) df4 = pd.concat([df2, df3], axis=1).reset_index() print (df4) ID Cost_sum Status_first Status_last Cost_F Cost_M No_of_F No_of_M 0 1 2100 M F 1850 250 3 2 1 2 1300 M F 1100 200 2 1 2 3 1250 M M 700 550 1 2 3 4 900 F M 800 100 1 1 用于计数,再次展平并最后使用DataFrame.pivot_table

Tsp = Model(with_optimizer(CPLEX.Optimizer, CPX_PARAM_EPGAP=0.00009)