如何在不改动原有索引的前提下向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'Title | Authors | Publishing Year | Publication House | |
|---|---|---|---|---|
| 1 | Il nome della rosa | Umberto Eco | 1980 | Bompiani |
| 2 | L'amore che ti meriti | Daria Bignardi | 2014 | Mondadori |
| 3 | Memorie dal sottsuolo | Fëdor Dostoevskij | 1864 | Rizzoli |
| 4 | Le avventure di Pinocchio | Carlo Collodi | 1883 | Giunti |
| 5 | Oblomov | Ivan Alexandrovich Goncharov | 1859 | Feltrinelli |
场景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
相关产品推荐
相关产品推荐

