根据另一列值的条件分组,计数,求和,子集(根据条件计数并创建新行)

时间:2019-07-30 18:38:02

标签: pandas pandas-groupby

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的天数

1 个答案:

答案 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
相关问题