使用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
相关产品推荐
相关产品推荐

