python - Pandas - 按所有列分组并在原始数据框中标记
问题描述
我有一个独特的DataFrame
with 列'Id'
,and'A', 'B', 'C'
等...
有不同的行,其中所有值'A', 'B', 'C'
都相同。我想给他们一个组名(从 1 开始的运行索引)。
例如:
df = pd.DataFrame({"A": [1, 1, 1, 2], "B": [3, 4, 4, 4], "C": [5, 5, 5, 5]})
df
Out[127]:
A B C
0 1 3 5
1 1 4 5
2 1 4 5
3 2 4 5
会变成
A B C grp
0 1 3 5 1
1 1 4 5 2
2 1 4 5 2
3 2 4 5 3
我知道我可以分组['A', 'B', 'C']
并获取密钥,但是,我必须在未优化的情况下迭代密钥和 Dataframe。我没有以优化的方式做到这一点
解决方案
df['grp'] = df.groupby(['A', 'B', 'C']).ngroup() + 1
print (df)
A B C grp
0 1 3 5 1
1 1 4 5 2
2 1 4 5 2
3 2 4 5 3
如果列已排序:
df['grp'] = pd.factorize([tuple(x) for x in df.values])[0] + 1
推荐阅读
- ssl - 负载平衡中 Google 管理的 SSL 证书的子域和定价
- flutter - Flutter、Fluro“匿名关闭”
- java - 如何使用 SQL Server Java 语言扩展进行日志记录?
- r - R中的new()和setClass()有什么区别?
- c# - 使用从 JS 代码到静态 Blazor 方法的注入服务
- javascript - 在放置事件之前检测文件是否被拖动?
- django - 我在主页上有一个评论模型,但它不会自动检测我在所有帖子中写评论的帖子
- javascript - 使用多个 SVG 滚动
- c - 如果我们改变 char* ptr = ; 指针指向的地址会改变吗?
- dask - 如何确保“分区”的数量在 dask 和 dask-cudf 的工作人员之间平均分配?