2017-09-13 220 views
0

我的索引对象是不可变的,一旦创建不能改变的文件中读取的不变性。但是我可以在创建后更改这些值。关于大熊猫据帧索引

我在这里错过了什么吗?

这是我的尝试:

ser = pd.Series([5,0,3,8,4], index=['red','blue','yellow','white','green']) 
ser 

red  5 
blue  0 
yellow 3 
white  8 
green  4 
dtype: int64 

ser.index = ['red','blue','yellow','white','test'] 
ser 

red  5 
blue  0 
yellow 3 
white  8 
test  4 
dtype: int64 
+2

这意味着你不能做'ser.index [0] =“wack'' – Zero

+2

语义这是略有不同,你正在做的是一个全新的指标替代指数,但你不能改变的个别索引元素作为@JohnGalt和答案显示 – EdChum

回答

3

注意的是,罪魁祸首是在Index类的__setitem__方法:

def __setitem__(self, key, value): 
    raise TypeError("Index does not support mutable operations") 

当您尝试设置索引的元素这TypeError提高。但是,这并没有说明重新分配索引。

OTOH,如果你考虑df.set_index这是设置索引的方法,你会看到,在最后,这样做是:

frame.index = index # Line 3016 

含义,你可以重新分配指标任何时候。


一个类似的例子应该有所帮助。假设你知道字符串的不变性。

string = 'test' 

是可能的:

string = 'test2' # reassignment 

不是!

string[0] = c  # item assignment... mutating the same object! 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-233-27903bb729b1> in <module>() 
----> 1 s[0] = c 

TypeError: 'str' object does not support item assignment 

以类似的方式可变性=重新分配。 ser.index工作与此类似。你可能会认为index作为有序frozenset。

+0

由于@COLDSPEED。解释非常清楚。 –

3

可以变化对象像你ser.index引用所做的,但你不能发生变异一次分配对象:

>>> import pandas as pd 
>>> ser = pd.Series([5,0,3,8,4], index=['red','blue','yellow','white','green']) 
>>> ser.index[2] = 'coconut' 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pandas/indexes/base.py", line 1404, in __setitem__ 
    raise TypeError("Index does not support mutable operations") 
TypeError: Index does not support mutable operations 

>>> lst = [''] * 5 
>>> ser.index = lst 
>>> ser.index 
Index(['', '', '', '', ''], dtype='object') 
>>> lst[:] = ['Mango', 'Banana', 'Orange', 'Pear', 'Apple'] # update list 
>>> lst 
['Mango', 'Banana', 'Orange', 'Pear', 'Apple'] 
>>> ser.index 
Index(['', '', '', '', ''], dtype='object')