首页 > 解决方案 > 如何逐行获取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

标签: pythonpandas

解决方案


我不知道你是如何得到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

推荐阅读