python - 使用 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
解决方案
您可以使用布尔索引来返回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
返回的布尔数据类型。布尔序列中的值本质上等同于or ,因此您可以使用,对其进行其他数学运算。例如,如果我们创建了一个具有返回数据类型的列或具有类似 `df['Group'] = np.where(df['Current Position'] == 的 STRINGS的列,您将无法进行这些数学运算0,“真”,“假”)。True
False
1
0
.cumsum()
sum
object
'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
推荐阅读
- javascript - 关闭另一个模式时打开模式的问题
- python - 重采样轨迹以在每个样本中具有相等的欧几里德距离
- kubernetes - 如何将 Kubernetes 仪表板限制为分配给特定角色的用户的特定仪表板
- android - “WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS”在 Android 11 上不起作用
- reactjs - React 窗口表在扩展行时重置
- python - 从德语句子中提取动词
- rpa - 将日期分配给变量并在 UiPath 中使用
- python - Beautifulsoup4 - 出现错误“NoneType”对象没有属性“字符串”
- memory - 当我仍然有足够的内存时,cuda push::sort 遇到了内存问题
- r - 将列表列表转换为 data.frame 或 tibble (R) 的单个嵌套行