首页 > 解决方案 > 使用 Pandas groupby 时,如何在满足列值时开始下一个组?

问题描述

我有一个 DataFrame,其中有一个名为“Current_Position”的列...我想在“Current_Position”的值等于 0 时将 DataFrame 分成组...我希望出现 0 的行是当前组的最后一行。下一行将开始下一组。我该如何做到这一点?

    Current_Position
0   2
1   4
2   2
3   0
4   2
5   0
6   2
7   0
8   1
9   2
10  0
11  2
12  1
13  0
14  1
15  2
16  1
17  0
18  1
19  0

预期输出:

    Current_Position  Group
0                  2      0
1                  4      0
2                  2      0
3                  0      0
4                  2      1
5                  0      1
6                  2      2
7                  0      2
8                  1      3
9                  2      3
10                 0      3
11                 2      4
12                 1      4
13                 0      4
14                 1      5
15                 2      5
16                 1      5
17                 0      5
18                 1      6
19                 0      6

标签: pythonpandasgroup-by

解决方案


您可以使用布尔索引来返回True或者False如果一行等于零。要使其成为组的最后一个,请使用.shift()移动一行。然后,使用.cumsum(), 来获取组:

df['Group'] = (df['Current_Position'].shift() == 0).cumsum()
df
Out[1]: 
    Current_Position  Group
0                  2      0
1                  4      0
2                  2      0
3                  0      0
4                  2      1
5                  0      1
6                  2      2
7                  0      2
8                  1      3
9                  2      3
10                 0      3
11                 2      4
12                 1      4
13                 0      4
14                 1      5
15                 2      5
16                 1      5
17                 0      5
18                 1      6
19                 0      6
  1. 我们曾经.shift()将数据向下移动一行。这允许具有0值的行成为组的最后一行而不是第一行。
  2. 我们曾经== 0转换为返回或Group返回的布尔数据类型。布尔序列中的值本质上等同于or ,因此您可以使用,对其进行其他数学运算。例如,如果我们创建了一个具有返回数据类型的列或具有类似 `df['Group'] = np.where(df['Current Position'] == 的 STRINGS的列,您将无法进行这些数学运算0,“真”,“假”)。TrueFalse10.cumsum()sumobject'True''False'

下面是分三个步骤的逻辑分解,因此可以很容易地可视化:

df['Group1'] = df['Current_Position'].shift()
df['Group2'] = (df['Group1'] == 0)
df['Group3'] = df['Group2'] .cumsum()
df
Out[2]: 
    Current_Position  Group1  Group2  Group3
0                  2     NaN   False       0
1                  4     2.0   False       0
2                  2     4.0   False       0
3                  0     2.0   False       0
4                  2     0.0    True       1
5                  0     2.0   False       1
6                  2     0.0    True       2
7                  0     2.0   False       2
8                  1     0.0    True       3
9                  2     1.0   False       3
10                 0     2.0   False       3
11                 2     0.0    True       4
12                 1     2.0   False       4
13                 0     1.0   False       4
14                 1     0.0    True       5
15                 2     1.0   False       5
16                 1     2.0   False       5
17                 0     1.0   False       5
18                 1     0.0    True       6
19                 0     1.0   False       6

推荐阅读