示例数据框
> 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),但将“上限” elapsedSeconds设置为120。对于只有1个payType的任何一天,请应用cap,以便仅使用120计算“ toPay”列。
但是...
还要对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']
所有这些都不是一成不变的,只要弄清楚逻辑,就会很高兴。所有建议和想法都将不胜感激。
答案 0 :(得分:2)
我们需要对一天进行分组,计算'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