繁体   English   中英

使用 Pandas groupby 时,如何在满足列值时启动下一个组?

[英]When using Pandas groupby, how do I start the next group when a column value is met?

我有一个 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

如果一行等于零,您可以使用布尔索引返回TrueFalse 要使其成为组的最后一个,请使用.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. 我们使用== 0Group转换为返回TrueFalse的布尔数据类型。 布尔系列中的值.cumsum()等同于10 ,因此您可以使用.cumsum()对其他数学运算sum 例如,如果我们创建了一个object数据类型的列,该列返回'True''False'字符串,其中包含类似 `df['Group'] = np.where(df[ '当前位置'] == 0, '真', '假')。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM