向DataFrame添加新行:为何用.loc[len(df)]而非.iloc[len(df)]?
为什么用
iloc[len(df)]给Pandas DataFrame添加行不生效? 咱们先还原一下场景:假设我们有这样一个简单的DataFrame:
import pandas as pd df = pd.DataFrame({"A": [1,2,3], "B": [4,5,6]})
当尝试用df.iloc[len(df)] = [9,9]添加新行时,要么直接报错,要么根本没效果,但换成df.loc[len(df)] = [9,9]却能正常新增一行,这背后的核心原因是iloc和loc的设计逻辑完全不同:
1. iloc的本质:只认“已存在的位置”
iloc是基于整数位置的索引,它的有效范围是从0到len(df)-1——因为DataFrame的行位置是从0开始计数的,当前有3行的话,合法的位置就是0、1、2。而len(df)的值是3,这个位置在当前DataFrame里根本不存在,Pandas不会允许你通过iloc去给一个不存在的位置赋值,就像你不能给列表[1,2,3]的list[3]直接赋值一样,这属于越界操作,实际运行会抛出IndexError: single positional indexer is out-of-bounds的错误。
2. loc的本质:可以创建“新标签”
loc是基于标签的索引,它的逻辑是:如果你指定的标签在当前索引中不存在,Pandas会自动帮你创建一个新行,把这个标签作为新行的索引,然后完成赋值。因为默认的DataFrame索引是从0开始的整数序列,len(df)正好是下一个未被使用的索引标签(当前索引是0、1、2,len(df)=3),所以loc会识别这是一个新标签,从而顺利新增一行数据。
举个直观的例子:
- 执行
df.loc[3] = [9,9]后,df的索引会变成[0,1,2,3],新增的行对应索引3; - 但如果强行执行
df.iloc[3] = [9,9],直接就会触发索引越界的错误,根本到不了新增行那一步。
内容的提问来源于stack exchange,提问作者BGa
相关产品推荐
相关产品推荐

