python - 如何逐行获取groupby cumsum的总数
问题描述
我有一个看起来像这样的df:
519 962.966667 91.525424 out_of_range 0 55.932203
520 970.666667 91.525424 out_of_range 1 91.525424
521 971.766667 81.355932 out_of_range 2 91.525424
522 972.900000 76.271186 out_of_range 3 81.355932
523 974.000000 76.271186 out_of_range 4 76.271186
524 975.100000 76.271186 out_of_range 5 76.271186
525 975.833333 76.271186 out_of_range 6 76.271186
526 977.066667 76.271186 out_of_range 7 76.271186
527 977.933333 76.271186 out_of_range 8 76.271186
528 978.833333 76.271186 out_of_range 9 76.271186
529 980.066667 55.932203 in_range 0 76.271186
530 981.200000 55.932203 in_range 1 55.932203
531 985.933333 66.101695 in_range 2 55.932203
532 987.566667 66.101695 in_range 3 66.101695
533 989.033333 55.932203 in_range 4 66.101695
534 991.000000 111.864407 out_of_range 0 55.932203
535 1004.900000 111.864407 out_of_range 1 111.864407
536 1006.033333 111.864407 out_of_range 2 111.864407
537 1007.166667 66.101695 in_range 0 111.864407
538 1008.300000 66.101695 in_range 1 66.101695
df[3] 表示某个值在设定范围内或外的位置。df[4] 表示每个 in_range 或 out_out_range 组的累积计数。
如何创建一个列,将每个 in_range out_of_range 组的大小逐行应用于整个组,如下所示(最后一列):
519 962.966667 91.525424 out_of_range 0 55.932203 9
520 970.666667 91.525424 out_of_range 1 91.525424 9
521 971.766667 81.355932 out_of_range 2 91.525424 9
522 972.900000 76.271186 out_of_range 3 81.355932 9
523 974.000000 76.271186 out_of_range 4 76.271186 9
524 975.100000 76.271186 out_of_range 5 76.271186 9
525 975.833333 76.271186 out_of_range 6 76.271186 9
526 977.066667 76.271186 out_of_range 7 76.271186 9
527 977.933333 76.271186 out_of_range 8 76.271186 9
528 978.833333 76.271186 out_of_range 9 76.271186 9
529 980.066667 55.932203 in_range 0 76.271186 4
530 981.200000 55.932203 in_range 1 55.932203 4
531 985.933333 66.101695 in_range 2 55.932203 4
532 987.566667 66.101695 in_range 3 66.101695 4
533 989.033333 55.932203 in_range 4 66.101695 4
534 991.000000 111.864407 out_of_range 0 55.932203 2
535 1004.900000 111.864407 out_of_range 1 111.864407 2
536 1006.033333 111.864407 out_of_range 2 111.864407 2
537 1007.166667 66.101695 in_range 0 111.864407 1
538 1008.300000 66.101695 in_range 1 66.101695 1
解决方案
我不知道你是如何得到cumcount
最初的。您可能需要更改groupby().cumcount()
来groupby().size()
获得所需的数字。
也就是说,使用当前数据帧,您可以使用cumsum()
来识别块和groupby().transform()
:
df['cumcount'] = df[4].groupby(df[4].eq(0).cumsum()).transform('max')
输出:
0 1 2 3 4 5 cumcount
0 519 962.966667 91.525424 out_of_range 0 55.932203 9
1 520 970.666667 91.525424 out_of_range 1 91.525424 9
2 521 971.766667 81.355932 out_of_range 2 91.525424 9
3 522 972.900000 76.271186 out_of_range 3 81.355932 9
4 523 974.000000 76.271186 out_of_range 4 76.271186 9
5 524 975.100000 76.271186 out_of_range 5 76.271186 9
6 525 975.833333 76.271186 out_of_range 6 76.271186 9
7 526 977.066667 76.271186 out_of_range 7 76.271186 9
8 527 977.933333 76.271186 out_of_range 8 76.271186 9
9 528 978.833333 76.271186 out_of_range 9 76.271186 9
10 529 980.066667 55.932203 in_range 0 76.271186 4
11 530 981.200000 55.932203 in_range 1 55.932203 4
12 531 985.933333 66.101695 in_range 2 55.932203 4
13 532 987.566667 66.101695 in_range 3 66.101695 4
14 533 989.033333 55.932203 in_range 4 66.101695 4
15 534 991.000000 111.864407 out_of_range 0 55.932203 2
16 535 1004.900000 111.864407 out_of_range 1 111.864407 2
17 536 1006.033333 111.864407 out_of_range 2 111.864407 2
18 537 1007.166667 66.101695 in_range 0 111.864407 1
19 538 1008.300000 66.101695 in_range 1 66.101695 1
推荐阅读
- sql - 使用 SELECT 来评估函数?
- python - 使用熊猫选择数据框中两个特定字符串之间的所有行
- java - cascade = CascadeType.ALL not working is spring data jpa
- botframework - 检测 Bot Framework 中的主题设置,即深色、高对比度、默认
- javascript - Javascript TypeError:无法读取未定义的属性“查找”
- javascript - Firebase 动态链接在 iOS 14 上的 Safari 中留下空白页面
- node.js - 为什么我只能运行全局安装的包?
- kubernetes - 使用 Docker 驱动程序启动 Minikube 并将其绑定到主机网络
- gitlab - Gitlab 管道中的 Datadog 日志记录
- oracle - 通过 oracle 制作 PL/SQL 块时,是否可以创建一个表,然后在同一个块中修改该表?