我有一个如下所示的数据框
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
答案 0 :(得分:2)
首先将列转换为日期时间,然后按DataFrame.sort_values
进行排序,然后针对ID
,GroupBy.agg
和GroupBy.first
,按sum
列的Multiindex
列进行汇总。用map
和join
将sum
展平。然后将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)