python - Pandas groupby 并为每一行创建一个唯一的 ID 列
问题描述
我有一个熊猫 DF:
import pandas as pd
df = pd.DataFrame([["apple",1],["apple",20],["apple",21],["mango",31],["mango",17]])
df.columns = ["fruit", "count"]
df
操作:
fruit count
0 apple 1
1 apple 20
2 apple 21
3 mango 31
4 mango 17
我正在尝试创建一个unique_row_id, for each row
在each group
. 例如,对于组apple
,unique
列应该有条目0,1,2
,因为有 3 行,对于组mango
,它应该0,1
有 2 行
df["unique_row_number_per_group"] =df.reset_index().groupby("fruit")["index"].transform(lambda x: pd.factorize(x)[0])
操作:
f ruit count unique_rows_per_group
0 apple 1 0
1 apple 20 1
2 apple 20 2
3 mango 31 0
4 mango 17 1
这很有效,但对于大型 DF 来说需要很长时间,任何关于以更高效的方式执行此操作的建议都会有所帮助
解决方案
如果您需要逐行计数,我们有cumcount
:
df['new'] = df.groupby('fruit').cumcount()
df
Out[346]:
fruit count new
0 apple 1 0
1 apple 20 1
2 apple 21 2
3 mango 31 0
4 mango 17 1
或者:
df['new'] = df.assign(new=1).groupby('fruit')['new'].cumsum()-1
df
Out[352]:
fruit count new
0 apple 1 0
1 apple 20 1
2 apple 21 2
3 mango 31 0
4 mango 17 1
推荐阅读
- ibm-mobilefirst - IBM MFP8 Oracle 二进制问题
- javascript - Angular 7 Guard 重定向仅适用于双击
- angular - 特殊字符不应该允许在反应形式中的第一个字符 - Angular 7
- python - Project Euler #25 - 性能可以进一步提高吗?
- javascript - 如何从 localhost php 文件中的“$.post”获取数据?
- javascript - 将函数作为参数传递给函数
- c# - 初始化基类中的所有派生成员变量是不是一个坏主意?
- html - 相对容器位置错误
- kubernetes - How to access external SMTP server from within Kubernetes cluster with Istio Service Mesh
- excel - 如果单元格包含特定文本,则删除 Outlook 约会