如何在DataFrame中为列值添加其出现位置的序号列?
解决DataFrame添加分组序列化名称列的问题
嘿,这个需求其实超简单的,不用你想的那种先提取唯一值和计数的绕路方式!直接用Pandas的分组累加功能就能完美解决,完全符合你要的按出现顺序编号的效果。
核心解法代码
首先构造你提供的示例DataFrame,然后一行代码就能生成目标列:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'Name': ['foo', 'foo', 'bar', 'foo', 'bar', 'shoo', 'shoo', 'foo', 'bar', 'bar'] }) # 生成"Serialized Name"列 df['Serialized Name'] = df['Name'] + '-' + (df.groupby('Name').cumcount() + 1).astype(str)
代码解释
这里的关键是两个Pandas方法的组合:
df.groupby('Name'):把DataFrame按Name列的相同值分组,比如所有foo行归为一组,bar行归为另一组。cumcount():对每个分组内的行从0开始顺序计数,加1后就能得到从1开始的序号,正好匹配你要的foo-1、foo-2这种格式。- 最后把序号转成字符串,和原
Name值拼接就得到了目标列。
最终输出结果
运行代码后,你的DataFrame会变成:
| Name | Serialized Name |
|---|---|
| foo | foo-1 |
| foo | foo-2 |
| bar | bar-1 |
| foo | foo-3 |
| bar | bar-2 |
| shoo | shoo-1 |
| shoo | shoo-2 |
| foo | foo-4 |
| bar | bar-3 |
| bar | bar-4 |
为什么不用你最初的思路?
你一开始想提取唯一值和计数列表的方式,其实会绕远路——因为你还需要对应每个行的位置去匹配序号,而groupby+cumcount是矢量化操作,直接对每个分组内的行按出现顺序生成序号,不仅代码简洁,处理大数据量时速度也快得多。
内容的提问来源于stack exchange,提问作者Rahul Sharma
相关产品推荐
相关产品推荐

