pandas如何将列表内多条数据逐行追加到DataFrame中
原代码报错原因
你写的df.loc[5::6] = l_row运行失败的核心问题是切片逻辑错误:5::6代表从索引5开始、步长为6选取行,最终只会匹配到索引5这1个行位置,但你传入的l_row包含2条待插入数据,赋值时左右长度不匹配,自然报错。
下面提供3种可直接复用的多行追加实现,适配你当前的元组列表格式:
实现方案
方案1:pd.concat拼接(官方推荐,批量追加性能最优)
pandas 2.0+版本已经移除了旧的append()方法,目前官方最推荐用concat做批量行拼接,只需要把待追加的数据转成和原DataFrame列结构一致的临时表,再拼接即可:
# 将待追加的元组列表转为同列名的DataFrame new_data = pd.DataFrame(l_row, columns=df.columns) # 拼接两个表,ignore_index=True会自动重置连续索引 df = pd.concat([df, new_data], ignore_index=True) # 如果需要保留你原来从1开始计数的索引,加一行重设即可 df.index = range(1, len(df)+1)
这个方法适合一次性追加多条数据的场景,性能比逐行插入高很多,不会出现索引错位问题。
方案2:loc逐行赋值(逻辑直观,适合少量数据)
你一开始用loc插入的思路是对的,不需要写复杂的步长切片,直接指定新行的索引位置赋值即可:
# 原表最后一行索引是4,新行直接指定索引5、6 df.loc[5] = l_row[0] df.loc[6] = l_row[1]
如果不想手动数索引,或者待追加的行数不固定,可以用你提到的for循环实现,逻辑也很简单:
start_idx = len(df) + 1 for i, row in enumerate(l_row): df.loc[start_idx + i] = row
哪怕l_row里有几十上百条数据,这个循环都能正常运行。
方案3:loc批量赋值(无需循环,写法简洁)
只要保证你选取的新索引数量和待追加的行数一致,就可以直接批量赋值,不用写循环:
# 自动生成连续的新索引 new_idx = range(len(df)+1, len(df)+1+len(l_row)) # 选中新索引的所有列,批量传入待追加数据 df.loc[new_idx, :] = l_row
注意这里必须加: 指定选中所有列,否则会因为列匹配逻辑问题触发报错。
注意事项
- 所有追加方法都要求传入的单行数据长度和原DataFrame的列数一致,且数据顺序和列顺序对应,否则会出现值错位、类型异常问题。
- 如果待追加的数据存在缺列情况,pandas会自动给对应位置填充空值
NaN。 - 不要在新代码里使用已经被弃用的
df.append()方法,避免pandas版本升级后代码无法运行。
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

