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

丹麦文

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

用户名

为了轻松向量化,您可以基于整个进行计算,然后仅向下索引到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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

分组时根据另一列的值对一列进行条件求和

如何根据另一列 SQL 中的值创建具有计数值的新列

如何根据另一列的值对一列进行计数/求和

通过根据条件连接另一列的值来创建新的pyspark DataFrame列

在 SSRS 报告中创建一列以根据前一列的条件对值求和

Pandas 数据框根据另一列的条件创建新行

通过根据条件从另一列添加先前的行值来更新/创建列

pandas 数据框按列分组,并根据计数分别更新另一列的行

根据与另一列不同的值对值进行计数

如何根据另一列的条件/分组删除一列中的连续重复行?

根据另一列的值根据条件添加具有值的新列

根据一列的字符和另一列的条件创建新列

根据条件和按组计数创建新列

根据另一列中的值创建一个计数连续变量

根据同一数据框中另一列的值对2列的值进行计数或求和

熊猫根据选择为条件的另一列中的值创建一列

如果值在一定范围内,则根据另一列的条件创建新列

根据列值的条件对选定的行进行分组,然后转换另一列

根据另一列的条件值绘制列的值?

如何根据另一列的计数删除NaN值为51%+的行

根据分组按另一列创建最接近值的新列

根据另一列 R 中的条件创建一个新列

根据另一列的条件创建熊猫列

如何根据另一列的条件创建熊猫列?

R:根据满足条件的另一列的值将值分配给新列

根据另一列中的不同值加上另一个条件对值求和

分组时根据另一列的值对一列求和

根据另一列的条件返回列值

根据在另一列中测试的条件创建带有组标签的新列