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

使用iloc[]与点符号访问pandas DataFrame列的意外行为

Pandas中iloc与点符号访问列的is判断问题

问题现象

执行以下代码时,is判断返回False,即使手动赋值后结果依然如此:

import pandas as pd
df = pd.DataFrame([[1,2]], columns=['one', 'two'])

# 首次判断返回False
print(df.iloc[:,0] is df.one)  # 输出: False

# 赋值后再次判断仍返回False
df.one = df.iloc[:,0]
print(df.iloc[:,0] is df.one)  # 输出: False

原因解释

is运算符判断的是两个变量是否指向内存中的同一个对象,而非数据是否相等。在pandas中:

  • df.one是直接引用DataFrame内部维护的对应列的Series对象;
  • df.iloc[:,0](包括方括号访问df['one'])每次调用时,都会生成一个新的Series视图对象——这个视图共享底层的numpy数组数据,但Series本身是新创建的包装对象,内存地址和df.one不同,因此is判断返回False。

验证数据是否同源

如果要确认两者是否指向同一份数据,可以判断底层的numpy数组是否一致:

print(df.iloc[:,0].values is df.one.values)  # 输出: True

返回True说明两者共享同一份底层数据,只是外层的Series包装对象不同。

补充说明

  • 不要用is来判断pandas对象是否相等,应该用equals()方法:df.iloc[:,0].equals(df.one)会返回True,这才是判断数据是否一致的正确方式;
  • 方括号访问df['one'] is df.one同样返回False,原理和iloc一致,都是每次生成新的Series视图对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 23:59:52