30天前,我开始学习熊猫。我只知道熊猫的基础。
我有一个数据框,如下所示。
根据ID和日期排序
ID Status Date Cost Duration
0 1 F 2017-06-22 500 nan
1 1 M 2017-07-22 100 30.00
2 1 P 2017-10-22 100 92.00
3 1 F 2018-06-22 600 243.00
4 1 P 2018-08-22 150 61.00
5 1 F 2018-10-22 120 61.00
6 1 F 2019-03-22 750 151.00
7 2 M 2017-06-29 200 nan
8 2 F 2017-09-29 600 92.00
9 2 F 2018-01-29 500 122.00
10 2 M 2018-03-29 100 59.00
11 2 P 2018-08-29 100 153.00
12 2 M 2018-10-29 100 61.00
13 2 F 2018-12-29 500 61.00
根据上面的数据框,我想按如下所示准备下面的数据框。
预期:
ID ID_F PS No_of_F No_of_M No_of_P NoD_to_PS PS_to_F
1 1_F1 nan 0 0 0 nan nan
1 1_F2 P 1 1 1 122 243
1 1_F3 P 2 1 2 426 61
1 1_F4 F 3 1 2 487 151
2 2_F1 M 0 1 0 nan 92
2 2_F2 F 1 1 0 92 122
2 2_F3 M 2 3 1 487 61
在上面的预期数据框中,有4个ID = 1的条目,因为ID = 1 有4个F。
PS =该F的先前状态
No_of_F =该F之前的F数
No_of_M =该F之前的M个数
No_of_P =该F之前的P数
No_of_days_to_PS =从开始到PS的天数
PS_to_F =从PS到该F的天数
答案 0 :(得分:2)
要轻松向量化,可以基于 entire 框架进行计算,然后仅索引到F
个值,从而得到所需的输出。
g = df['ID']
dg = df['Date'].groupby(g)
dm = dg.shift() - dg.transform('first')
mdm = dm.mask(dm.eq(pd.Timedelta('0D')))
d = dict(
PS=df['Status'].shift(),
No_of_F=df['Status'].eq('F').groupby(g).cumsum().sub(1),
No_of_M=df['Status'].eq('M').groupby(g).cumsum(),
No_of_P=df['Status'].eq('P').groupby(g).cumsum(),
No_of_days_to_PS=mdm,
PS_to_F=df.Date.diff(),
)
pd.DataFrame(d)[df['Status'].eq('F')]
PS No_of_F No_of_M No_of_P No_of_days_to_PS PS_to_F
0 NaN 0.0 0.0 0.0 NaT NaT
3 P 1.0 1.0 1.0 122 days 243 days
5 P 2.0 1.0 2.0 426 days 61 days
6 F 3.0 1.0 2.0 487 days 151 days
8 M 0.0 1.0 0.0 NaT 92 days
9 F 1.0 1.0 0.0 92 days 122 days
13 M 2.0 3.0 1.0 487 days 61 days