如何将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
错误原因排查
- 缺少原表去重步骤:原始z有6行数据,预期输出仅保留每个name首次出现的行共3行,代码未提前做去重处理,行索引与预期结构不匹配。
- 循环变量复位逻辑错误:x、i两个计数器应该在每次处理新的唯一值前重置为1,现有代码仅在x超过当前值重复次数时才复位,处理完第一个有重复的name后,计数器值错乱,后续name的赋值逻辑完全错误。
- 重复值赋值循环缺失:单个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)
运行输出结果
| name | name1 | name2 | |
|---|---|---|---|
| 0 | a | a | |
| 1 | b | ||
| 2 | c | c | c |
内容的提问来源于stack exchange,提问作者Afonseca
相关产品推荐
相关产品推荐

