python - 熊猫计数组号
问题描述
给定以下数据框:
df=pd.DataFrame({'col1':['A','A','A','A','A','A','B','B','B','B','B','B'],
'col2':['x','x','y','z','y','y','x','y','y','z','z','x'],
})
df
col1 col2
0 A x
1 A x
2 A y
3 A z
4 A y
5 A y
6 B x
7 B y
8 B y
9 B z
10 B z
11 B x
我想创建一个新列,col3
它col2
按顺序对值进行分类,按以下值分组col1
:
col1 col2 col3
0 A x x1
1 A x x1
2 A y y1
3 A z z1
4 A y y2
5 A y y2
6 B x x1
7 B y y1
8 B y y1
9 B z z1
10 B z z1
11 B x x2
在上面的例子中,col3[0:1]
有一个值,因为它是forx1
中的第一组x
值。具有的值,因为它是for等中的第二组值...col2
col1 = A
col3[4:5]
y2
y
col2
col1 = A
我希望描述是有道理的。我无法找到部分答案,因为我找不到一种优雅的方式来表达我在寻找什么。
解决方案
这是我的方法:
groups = (df.assign(s=df.groupby('col1')['col2'] # group col2 by col1
.shift().ne(df['col2']) # check if col2 different from the previous (shift)
.astype(int) # convert to int
) # the new column s marks the beginning of consecutive blocks with `1`
.groupby(['col1','col2'])['s'] # group `s` by `col1` and `col2`
.cumsum() # cumsum by group
.astype(str)
)
df['col3'] = df['col2'] + groups
输出:
col1 col2 col3
0 A x x1
1 A x x1
2 A y y1
3 A z z1
4 A y y2
5 A y y2
6 B x x1
7 B y y1
8 B y y1
9 B z z1
10 B z z1
11 B x x2
推荐阅读
- python - 如何在不关闭浏览器的情况下在 Google Colab 上使用 Selenium?
- python - 在 Python 中使用 4GB 写入限制绕过 OSError 'File too large'?
- c# - 与实体相比,另一层中的 DbContext
- java - 为什么我们返回“head”,在这个例子中它是如何改变的?
- python - 如何限制鼠标光标离开 PySide2 中的 QWidget 区域
- php - Wordpress Nav Walker Anchor 仅在 li
- reactjs - 如何在 onClick 中使用取决于一系列复选框字段的过滤器设置反应状态
- r - 以累积方式在数据框列表中建立一个值
- python-3.x - mimtproxy 运行 python 脚本:“XX 模块未导入”
- apache-spark - 使用 Windows env 在分布式集群上运行的 Spark 作业抱怨无法删除临时文件夹之一