在新值上重置的累积和,无循环

2024-05-16 07:43:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要帮助做一个累计总和,当条件改变时重置。我使用了循环,但数据集太重。我也尝试过使用这两个链接,但我无法得到我想要的输出。我无法从数据帧中删除重复项,因为我需要示例表中未显示的信息

Cumulative sum that resets based on the year

Pandas cumulative count

我有License PlateTransp Doc列,需要一个名为Deliveries的新列,条件是:如果是相同的车牌和相同的运输单据,则视为1次交付,但是如果不是相同的运输单据,则添加1次,如果不是相同的车牌,则重置累计和。 这个方法所基于的excel公式(设置在单元格C3上)是=IF(A2=A3;IF(B2=B3;C2+0;C2+1);1)

^{tb1}$
import pandas as pd


DF = pd.DataFrame({'License Plate': ["AAA1111","AAA1111","AAA1111","BBB2222","BBB2222","BBB2222","CCC3333","CCC3333","DDD4444"],
          'Transp Doc': [65184,65186,65188,65195,65195,65201,65207,65207,65212],
          'Deliveries': [1,2,3,1,1,2,1,1,1],
          })

我最多只能用这句话:

DF['Deliveries'] = DF['License Plate'].eq(DF['License Plate'].shift()).cumsum()

如果上排相等,则只求和,而不考虑Transp Doc是否相同,并且在换版时不会重置


Tags: 数据dfdociflicense条件重置c2
1条回答
网友
1楼 · 发布于 2024-05-16 07:43:41

查找重复的行(基于车牌和transp doc),这将产生一个布尔序列。反转序列,您可以将布尔值相加为整数0和1(但现在还不能)

然后根据车牌分组,在更换车牌时拆分此系列。最后,对这些组使用累积和(将布尔值添加为整数),并将结果分配给数据帧中的新列

import pandas as pd
df = pd.DataFrame({'License Plate': ["AAA1111","AAA1111","AAA1111","BBB2222","BBB2222","BBB2222","CCC3333","CCC3333","DDD4444"],
          'Transp Doc': [65184,65186,65188,65195,65195,65201,65207,65207,65212],
          'Deliveries': [1,2,3,1,1,2,1,1,1],
          })
df['Deliveries'] = (~df.duplicated(['License Plate', 'Transp Doc'])).groupby(df['License Plate']).cumsum()
print(df)
  License Plate  Transp Doc  Deliveries
0       AAA1111       65184           1
1       AAA1111       65186           2
2       AAA1111       65188           3
3       BBB2222       65195           1
4       BBB2222       65195           1
5       BBB2222       65201           2
6       CCC3333       65207           1
7       CCC3333       65207           1
8       DDD4444       65212           1

相关问题 更多 >