熊猫复杂的分组依据,计算并应用上限

用户名

样本数据框

> 0   location_day       payType    Name   ratePay      elapsedSeconds   
> 1   2019-12-10           PRE       Amy    12.25             199 
> 2   2019-12-12           PRE       Amy    12.25               7 
> 3   2019-12-17           PRE       Amy    12.25              68 
> 4   2019-12-17            RP       Amy     8.75              62

对于每一天,对elapsedSeconds进行总和,并计算总toPay的新列(elapsedSeconds * ratePay),但将“ cap”值设为120秒。对于只有1个payType的任何一天,请应用cap,以便仅将120用于计算“ toPay ” col。

但...

同样,对groupby payType进行分组,以便如果在一天中有2个唯一的“ payTypes”,则对elapsedSeconds求和以确定其是否超出上限(120),如果是,则从上一个payType中减去elapsedSeconds以使总和等于120 。

所以我希望这个输出:

> 0   location_day       payType    Name   ratePay      elapsedSeconds  
> 1   2019-12-10           PRE       Amy    12.25             120    
> 2   2019-12-12           PRE       Amy    12.25               7  
> 3   2019-12-17           PRE       Amy    12.25              68  
> 4   2019-12-17            RP       Amy     8.75              52

我不太确定如何解决这一问题,实际上只执行了一些非常基本的分组和测试,例如使用条件语句来计算新列

finDfcalc1 = finDf.sort('location_day').groupby(flds)['elapsedSeconds'].sum().reset_index()
finDfcalc1.loc[finDfcalc1['elapsedSeconds'] < 120, 'elapsedSecondsOverage'] = finDfcalc1['elapsedSeconds'] * 1
finDfcalc1.loc[finDfcalc1['elapsedSeconds'] > 120, 'elapsedSecondsOverage'] = finDfcalc1['elapsedSeconds'] - 120
finDfcalc1['toPay'] = finDfcalc1['ratePay'] * finDfcalc1['elapsedSecondsOverage']

所有这些都不是一成不变的,只要制定出逻辑就将非常高兴。非常感谢所有建议和想法。

洛兹

我们需要对一天进行分组,计算的总和,'elapsedSeconds'然后应用某种逻辑将一天中的总数裁剪为120秒,然后针对所有行重新计算正确的秒数。

这是一个更长的示例数据集,用于显示多天需要更改的行如何表现。

location_day       payType    Name   ratePay      elapsedSeconds   
2019-12-10           PRE       Amy    12.25             199 
2019-12-12           PRE       Amy    12.25               7 
2019-12-17           PRE       Amy    12.25              68 
2019-12-17            RP       Amy     8.75              62
2019-12-18           PRE       Amy    12.25              50 
2019-12-18            RP       Amy     8.75              60
2019-12-18            RA       Amy     8.75              20
2019-12-18            RE       Amy     8.75              10
2019-12-18            XX       Amy     8.75              123 

码:

# Will become the seconds you want in the end
df['real_sec'] = df.groupby('location_day').elapsedSeconds.cumsum()

# Calculate a difference
m = df['real_sec'] - df['elapsedSeconds']

                                      #MagicNum
df['real_sec'] = (df['real_sec'].clip(upper=120)   # 120 at most
                  - m.where(m.gt(0)).fillna(0)     # only change rows where diff is positive
                 ).clip(lower=0)                   # Negative results -> 0 

 location_day payType Name  ratePay  elapsedSeconds  real_sec
0   2019-12-10     PRE  Amy    12.25             199     120.0
1   2019-12-12     PRE  Amy    12.25               7       7.0
2   2019-12-17     PRE  Amy    12.25              68      68.0
3   2019-12-17      RP  Amy     8.75              62      52.0
4   2019-12-18     PRE  Amy    12.25              50      50.0
5   2019-12-18      RP  Amy     8.75              60      60.0
6   2019-12-18      RA  Amy     8.75              20      10.0
7   2019-12-18      RE  Amy     8.75              10       0.0
8   2019-12-18      XX  Amy     8.75             123       0.0

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章