【问题标题】:Cumulative sum that resets on new value, without a loop在新值上重置的累积和,没有循环
【发布时间】:2021-07-27 00:36:57
【问题描述】:

我需要帮助来计算在条件发生变化时重置的累积总和。我使用了一个循环,但数据集太重了。也尝试使用这两个链接,但我无法获得我想要的输出。我无法从数据框中删除重复项,因为我需要示例表中未显示的信息。

Cumulative sum that resets based on the year

Pandas cumulative count

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

A B C
1 License Plate Transp Doc Deliveries
2 AAA1111 65184 1
3 AAA1111 65186 2
4 AAA1111 65188 3
5 BBB2222 65195 1
6 BBB2222 65195 1
7 BBB2222 65201 2
8 CCC3333 65207 1
9 CCC3333 65207 1
10 DDD4444 65212 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['License Plate'].eq(DF['License Plate'].shift()).cumsum()

只求上一行是否相等,不考虑Transp Doc是否相同,换版时不重置。

【问题讨论】:

    标签: python cumulative-sum


    【解决方案1】:

    找到重复的行(基于车牌和 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
    

    【讨论】:

      猜你喜欢
      • 2021-07-04
      • 1970-01-01
      • 2016-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-18
      • 2019-02-01
      • 1970-01-01
      相关资源
      最近更新 更多