gpt4 book ai didi

Pandas 复杂分组,计数并应用上限

转载 作者:行者123 更新时间:2023-12-04 10:41:59 25 4
gpt4 key购买 nike

示例数据框

> 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),但应用 120 的“上限”elapsedSeconds。对于只有 1 个 payType 的任何一天,应用上限,以便只有 120 用于计算“toPay” “上校。

但...

此外,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'的cumsum然后应用一些逻辑将一天内的总数剪辑为 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

关于 Pandas 复杂分组,计数并应用上限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59882924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com