这是一段令我惊讶(并困扰)我的一段代码的最小,完整且可验证的例子:
>>> 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]
时,会引发异常。这似乎与我相当不一致。我希望getitem
和setitem
都引发异常,或两者都在数据框中返回一个标量。
答案 0 :(得分:1)
您可能知道,df['a']
是一个系列因为,
使用[](a.k.a。 getitem 为这些索引编制索引的主要功能 熟悉在Python中实现类行为)正在选择 低维切片。
所以没有专栏。您无法使用.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