如何在Pandas分组DataFrame中添加首个按组递增的person索引?
实现按分组生成连续递增的person索引
当然可以实现你的需求!问题的核心是要给每个唯一的id分配一个连续递增的整数编号,而不是给每一行单独编号。下面是两种简单高效的Pandas实现方法:
方法1:使用pd.factorize()
factorize()方法专门用于将分类变量转换为连续的整数标签,正好匹配我们的需求——它会为每个唯一的id分配从0开始的递增编号,且同一id的编号完全一致。
示例代码:
import pandas as pd # 构造原始数据 data = { "id": ["sdfg", "fgjh", "fgjh", "hjsa"], "last_name": ["Muller", "Smith", "Smith", "Jackson"], "first_name": ["Peter", "Rob", "Robert", "Michael"] } df = pd.DataFrame(data) # 生成person列:对id进行factorize,取返回的标签部分 df["person"] = pd.factorize(df["id"])[0] # 调整列顺序,把person放到最前面 df = df[["person", "id", "last_name", "first_name"]] print(df)
输出结果:
person id last_name first_name 0 0 sdfg Muller Peter 1 1 fgjh Smith Rob 2 1 fgjh Smith Robert 3 2 hjsa Jackson Michael
方法2:使用groupby().ngroup()
另一种方法是先按id分组,再用ngroup()为每个分组分配连续的组编号,效果和上面完全一致:
示例代码:
# 生成person列:按id分组后获取组编号 df["person"] = df.groupby("id").ngroup() # 同样调整列顺序 df = df[["person", "id", "last_name", "first_name"]]
为什么reset_index()不行?
reset_index()是对DataFrame的每一行重新分配索引,不管分组情况,所以会生成全局递增的行号,而不是按唯一id的分组编号,这和你的需求不匹配。
内容的提问来源于stack exchange,提问作者Michael Dorner
相关产品推荐
相关产品推荐

