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

如何在不改动原有索引的前提下向pandas DataFrame插入新行

问题根源

你的代码里写了for i in range(1, 6)循环,会重复执行5次插行、改索引、排序的操作,最后会生成大量重复行,索引也会完全混乱,自然得不到预期结果。而且这个循环逻辑本身就没有存在的必要,pandas插行根本不需要循环操作。

正确实现方案

根据你是否需要保留原有行的索引,分两种常见场景实现:

场景1:插入后索引为从1开始的连续序号

这是最常用的场景,用切片拼接实现,代码简洁不容易出错:

import pandas as pd
# 复现你的原始数据集
data = [("Il nome della rosa","Umberto Eco", 1980), 
        ("L'amore che ti meriti","Daria Bignardi", 2014), 
        ("Memorie dal sottsuolo", " Fëdor Dostoevskij", 1864), 
        ("Oblomov", "Ivan Alexandrovich Goncharov ", 1859)]
index = range(1,5,1)
data = pd.DataFrame(data, columns = ["Books'Title", "Authors", "Publishing Year"], index = index)
pubhouses = ["Bompiani", "Mondadori", "Rizzoli", "Feltrinelli"]
data.insert(3, 'Publication House', pubhouses)

# 定义要插入的新行,需要转成同列结构的DataFrame
new_row = pd.DataFrame(
    [['Le avventure di Pinocchio', 'Carlo Collodi',  1883, 'Giunti']],
    columns = data.columns
)

# 插入到第4个位置(iloc从0开始计数,第4位对应切片位置3)
insert_pos = 3
data = pd.concat([data.iloc[:insert_pos], new_row, data.iloc[insert_pos:]]).reset_index(drop=True)
# 把索引调整为从1开始
data.index = data.index + 1

执行后得到的结果完全符合预期:

Books'TitleAuthorsPublishing YearPublication House
1Il nome della rosaUmberto Eco1980Bompiani
2L'amore che ti meritiDaria Bignardi2014Mondadori
3Memorie dal sottsuoloFëdor Dostoevskij1864Rizzoli
4Le avventure di PinocchioCarlo Collodi1883Giunti
5OblomovIvan Alexandrovich Goncharov1859Feltrinelli

场景2:保留原有行的索引值不变

如果你需要原来4行的索引1/2/3/4保持不变,只把新行放到第4位,可以单独给新行设置不冲突的索引再拼接:

# 接上面的原始数据、新行定义
insert_pos = 3
part1 = data.iloc[:insert_pos]
part2 = data.iloc[insert_pos:]
# 给新行设置一个不和原有索引冲突的值,比如0
new_row.index = [0]
# 拼接后不需要重置索引
data = pd.concat([part1, new_row, part2])
索引调整常用操作
  • 重置为从0开始的连续自然索引:执行data = data.reset_index(drop=True),参数drop=True表示丢弃旧索引,不要把旧索引存为新列。
  • 调整为从1开始的连续序号索引:重置索引后执行data.index = data.index + 1,需要从其他数值开始时替换加的固定值即可。
  • 自定义索引值:直接给data.index传入和DataFrame行数等长的列表,比如data.index = ['a','b','c','d','e']就能设置自定义的字符串索引。

提示:pandas没有提供和插列方法insert()对标的原生指定位置插行方法,所有位置插行的实现本质都是拆分原表、拼接新行,不要用循环反复修改索引,效率极低还容易引发索引混乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 15:18:15