使用Pandas在DataFrame指定位置添加行时原有行消失的问题
解决Pandas插入新行时覆盖原有行的问题
问题原因
你当前的代码是通过loc[index]或iloc[index]直接给指定位置赋值,这本质是替换该索引对应的原有行,而非在指定位置插入新行,所以才会出现原有行被覆盖消失的情况。
解决方案
要实现插入新行的需求,需要把目标DataFrame拆分为插入点前的部分、新行数据、插入点后的部分,再重新合并。推荐使用pd.concat方法,步骤如下:
- 构造新行的DataFrame
先把要插入的5行数据整理成和final_table列名一致的DataFrame:
# 构造5行新数据,列数与final_table匹配 new_rows_data = [ [2023] + [0]*17, ['I'] + [0]*17, ['II'] + [0]*17, ['III'] + [0]*17, ['IV'] + [0]*17 ] new_rows = pd.DataFrame(new_rows_data, columns=final_table.columns)
- 拆分并合并原有DataFrame
假设你要在final_table_row_num + 91这一行之后插入新行,执行以下代码:
# 确定插入位置的行位置(基于顺序,不是标签) insert_position = final_table_row_num + 91 + 1 # 在my_row行之后插入新行 # 拆分并合并DataFrame final_table = pd.concat([ final_table.iloc[:insert_position], # 保留插入位置之前的所有行 new_rows, # 插入新行数据 final_table.iloc[insert_position:] # 保留插入位置之后的原有行 ], ignore_index=True)
- 用
iloc[:insert_position]按行位置选取数据,避免因行标签不连续导致的选行错误 ignore_index=True会重置合并后的行索引,避免出现重复或混乱的索引问题
关于原代码中my_row的处理
如果你是要插入my_row而非替换原有行,同样需要用上述逻辑:先把my_row转为单行DataFrame,再插入到指定位置,而不是直接用iloc[index] = my_row替换。示例:
# 把my_row转为单行DataFrame my_row_df = pd.DataFrame([my_row.values], columns=final_table.columns) # 在指定位置插入my_row insert_my_pos = final_table_row_num + 91 final_table = pd.concat([ final_table.iloc[:insert_my_pos], my_row_df, final_table.iloc[insert_my_pos:] ], ignore_index=True)
关键注意点
- 明确**位置索引(iloc)和标签索引(loc)**的区别:如果
final_table的行标签不是连续整数,必须用iloc按位置拆分,避免选行错误 - 插入行后务必重置索引(
ignore_index=True),否则后续操作容易出现索引冲突问题
内容的提问来源于stack exchange,提问作者VB666
相关产品推荐
相关产品推荐

