在没有循环的情况下重置为新值的累积和
Cumulative sum that resets on new value, without a loop
我需要帮助来计算当条件改变时重置的累计总和。我使用了一个循环,但数据集太重了。也尝试使用这两个链接,但我无法获得所需的输出。我无法从数据框中删除重复项,因为我需要示例中未显示的信息 table。
Cumulative sum that resets based on the year
Pandas cumulative count
我有 License Plate
和 Transp Doc
列,需要一个名为 Deliveries
的新列,条件是:如果它是相同的车牌和相同的 Transp Doc被视为 1 次交付,但如果它不是相同的 Transp Doc,则加 1,如果它不是相同的车牌,则重置累计金额。
我基于此方法的 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是否相同,换版不重置
找到重复的行(基于车牌和运输文档),这将导致布尔系列。反转系列,您可以将布尔值加起来作为整数 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
我需要帮助来计算当条件改变时重置的累计总和。我使用了一个循环,但数据集太重了。也尝试使用这两个链接,但我无法获得所需的输出。我无法从数据框中删除重复项,因为我需要示例中未显示的信息 table。
Cumulative sum that resets based on the year
Pandas cumulative count
我有 License Plate
和 Transp Doc
列,需要一个名为 Deliveries
的新列,条件是:如果它是相同的车牌和相同的 Transp Doc被视为 1 次交付,但如果它不是相同的 Transp Doc,则加 1,如果它不是相同的车牌,则重置累计金额。
我基于此方法的 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是否相同,换版不重置
找到重复的行(基于车牌和运输文档),这将导致布尔系列。反转系列,您可以将布尔值加起来作为整数 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