You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将pandas列的重复值转置到其首次出现行的指定新列中

重复值转置到首次出现行对应新列实现

操作前置代码

创建数据集

import numpy as np
import pandas as pd
ref = ['a','a','b','c','c','c']
z = pd.DataFrame(ref)
z = z.rename(columns={0:'name'})

统计唯一值的首次索引与重复次数(结构:{name: [索引位置, 重复次数]})

unique_values = {}
i = 0
while i <= len(z)-1:
    for x in z.name:
        if x not in unique_values:
            unique_values[x] = i,0
            i+=1
        else:
            unique_values[x] = unique_values[x][0] , unique_values[x][1]+1
            i+=1

需求与问题说明

预期以unique_values为参考生成新列,最终输出的数据集效果:
name列值为['a', 'b', 'c'],name1列值为['a', <NA>, 'c'],name2列值为[<NA>, <NA>, 'c']。
原有生成新列的代码无法达到预期,代码如下:

x = 1
i = 1
for k,v in unique_values.items():
    if v[1] > 0:
        print(k,v,x)
        if x <= v[1]:
            z[f'name{x}'] = pd.Series(z.name.loc[z.index[v[0]+i]], index=z.index[[v[0]]])
            x+=1
            i+=1
        else:
            x = 1
            i = 1

错误原因排查

  1. 缺少原表去重步骤:原始z有6行数据,预期输出仅保留每个name首次出现的行共3行,代码未提前做去重处理,行索引与预期结构不匹配。
  2. 循环变量复位逻辑错误:x、i两个计数器应该在每次处理新的唯一值前重置为1,现有代码仅在x超过当前值重复次数时才复位,处理完第一个有重复的name后,计数器值错乱,后续name的赋值逻辑完全错误。
  3. 重复值赋值循环缺失:单个name有多次重复时,现有代码仅会赋值一次新列,无法生成对应数量的新列。

修正后完整代码

import numpy as np
import pandas as pd

# 创建数据集
ref = ['a','a','b','c','c','c']
z = pd.DataFrame(ref, columns=['name'])

# 统计唯一值的首次索引与重复次数
unique_values = {}
i = 0
for x in z.name:
    if x not in unique_values:
        unique_values[x] = [i, 0]
    else:
        unique_values[x][1] += 1
    i += 1

# 先保留每个name首次出现的行,得到基础3行结构
z = z.drop_duplicates('name', keep='first').reset_index(drop=True)

# 生成新列
for idx, (name, (first_idx, repeat_cnt)) in enumerate(unique_values.items()):
    for j in range(1, repeat_cnt + 1):
        col_name = f'name{j}'
        # 对应行赋值
        z.loc[idx, col_name] = name

print(z)

运行输出结果

namename1name2
0aa
1b
2ccc

内容的提问来源于stack exchange,提问作者Afonseca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 09:12:02