Pandas不使用for循环/iterrows为两列唯一组合生成标识列的实现方法
实现方案
直接使用pandas内置的groupby.ngroup()方法即可一行完成需求,无需手动遍历:
import pandas as pd df = pd.DataFrame({'a': [1, 2, 3, 4, 3, 4, 1, 2], 'b': [3, 2, 1, 2, 3, 2, 3, 2]}) # 核心实现代码 df['unique'] = 'unique' + df.groupby(['a', 'b'], sort=False).ngroup().add(1).astype(str)
代码说明
groupby(['a', 'b'], sort=False):按a、b两列组合分组,sort=False强制分组顺序和组合首次出现的顺序一致,不会因自动排序打乱编号顺序。ngroup():给每个分组分配从0开始递增的唯一数字ID。add(1):将起始编号调整为1,符合uniqueN的命名规则。- 转字符串后拼接
unique前缀,直接生成目标列。
输出结果
运行后输出和预期完全一致:
a b unique 0 1 3 unique1 1 2 2 unique2 2 3 1 unique3 3 4 2 unique4 4 3 3 unique5 5 4 2 unique4 6 1 3 unique1 7 2 2 unique2
这种矢量化实现相比iterrows遍历,在数据量超过1万行时性能会有百倍以上的提升,完全符合pandas的惯用写法。
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

