使用setitem时,Pandas不会抛出异常

时间:2016-03-18 08:13:09

标签: python python-2.7 pandas

这是一段令我惊讶(并困扰)我的一段代码的最小,完整且可验证的例子:

>>> import pandas as pd
>>> df = pd.DataFrame([[1,2], [3,4]], columns = ['a','b'])
>>> df['a'].iloc[0,0] = 10 # df has not changed, and no exception is thrown
>>> df 
   a  b
0  1  2
1  3  4
>>> df['a'].iloc[0,0] # this throws an exception
IndexingError                             Traceback (most recent call last)

因此,当我用iloc[0,0]调用setitem时,不会引发异常,但没有设置任何异常。 当我使用getitem调用iloc[0,0]时,会引发异常。这似乎与我相当不一致。我希望getitemsetitem都引发异常,或两者都在数据框中返回一个标量。

1 个答案:

答案 0 :(得分:1)

您可能知道,df['a']是一个系列因为,

  

使用[](a.k.a。 getitem 为这些索引编制索引的主要功能   熟悉在Python中实现类行为)正在选择   低维切片。

     

Basics

所以没有专栏。您无法使用.iloc[0, Fail!]因此df['a'].iloc[0, 0]例外是正常的。

关于df['a'].iloc[0, 0] = 10的例外,它是预期的。

  

很难预测它是否会返回视图或副本(它   取决于数组的内存布局,大熊猫没有   保证)

     

<强> Returning a view versus a copy

     

<强> Why does assignment fail when using chained indexing?

仅供参考,如果您想更改df(0,0)的值,您应该尝试这种方式。

df.iloc[0, 0] = 10 
df.ix[0, 'a'] = 10 
df.loc[0, 'a'] = 10