如何在Pandas DataFrame中重置索引计数(保留每个索引对应的多行结构)
解决Pandas DataFrame重置重复索引列名序号的问题
我来帮你搞定这个需求!你需要把DataFrame中重复出现的数值型列名替换成从1开始的连续序号,同时完全保留原有的列结构(数值列和标签列交替的形式)。下面是具体的实现方法:
步骤说明
- 提取所有重复的数值列名,生成“唯一值→连续序号”的映射字典;
- 遍历原列名列表,将数值列名替换为对应序号,非数值列名保持不变;
- 把新列名列表赋值给DataFrame,完成修改。
代码示例
假设你的原DataFrame模拟结构如下:
import pandas as pd # 模拟原DataFrame数据 data = [['Alice', 10, 'val1', 10, 'val2', 20, 'val3', 20, 'val4', 30, 'val5', 30, 'val6', 40, 'val7']] df = pd.DataFrame(data, columns=['Name', 1234, 'AA', 1234, 'AB', 1235, 'BA', 1235, 'BB', 1236, 'CA', 1236, 'CB', 1237, 'DA'])
执行以下代码完成列名替换:
# 获取原列名列表 cols = df.columns.tolist() # 提取所有数值型列名(排除'Name'),并筛选唯一值(按数值大小排序) unique_numeric_cols = sorted(list(set([col for col in cols if col != 'Name' and str(col).isdigit()]))) # 创建映射:原数值 → 连续序号(从1开始) num_to_seq = {num: idx + 1 for idx, num in enumerate(unique_numeric_cols)} # 生成新的列名列表 new_columns = [] for col in cols: if col in num_to_seq: new_columns.append(num_to_seq[col]) else: new_columns.append(col) # 替换DataFrame的列名 df.columns = new_columns
执行后就能得到你期望的结构:
| Name | 1 | AA | 1 | AB | 2 | BA | 2 | BB | 3 | CA | 3 | CB | 4 | DA |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Alice | 10 | val1 | 10 | val2 | 20 | val3 | 20 | val4 | 30 | val5 | 30 | val6 | 40 | val7 |
补充说明
- 如果数值列名是字符串类型(比如
'1234'而非整数1234),这段代码同样适用,str(col).isdigit()能兼容两种类型; - 若希望序号按原数值首次出现顺序排序(而非数值大小),可以去掉
sorted(),改用dict.fromkeys()保留顺序:unique_numeric_cols = list(dict.fromkeys([col for col in cols if col != 'Name' and str(col).isdigit()]))
内容的提问来源于stack exchange,提问作者rekeson21
相关产品推荐
相关产品推荐

