[英]Why do I get index value inside column value when I do 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
如果一行等于零,您可以使用布尔索引返回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
.shift()
将数据向下移动一行。 这允许具有0
值的行作为组的最后一行而不是第一行。== 0
将Group
转换为返回True
或False
的布尔数据类型。 布尔系列中的值.cumsum()
等同于1
或0
,因此您可以使用.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.