由于 set_values 和 pandas 中的 at() 由于 Python3 而没有属性 'set_values' 或 'At_indexer' 错误

No attribute 'set_values' or 'At_indexer' error due to set_values and at() in pandas due to Python3

我是 pandas 的新手,仍在学习中。 我正在尝试按标签顺序添加两个数字。一种方法是:

    numbers = pd.Series(np.random.randint(0,1000,10000))
    for label, value in numbers.iteritems():
        numbers.set_values(label, value+2)
    numbers.head()

输出:

AttributeError: 'Series' object has no attribute 'set_values'

经过研究,我发现它已被弃用,取而代之的是 at() 。 所以当我这样使用它时:

for label, value in numbers.iteritems():
    numbers.at(label, value+2)
numbers.head()

输出:

TypeError: '_AtIndexer' object is not callable

所以当我像这样使用 at[]:

for label, value in numbers.iteritems():
    numbers.at[label, value+2]
numbers.head()

我得到这个输出:

   KeyError                                  Traceback (most recent call last)
<ipython-input-43-b1f985a669d7> in <module>
      1 for label, value in numbers.iteritems():
----> 2     numbers.at[label, value+2]
      3 
      4 numbers.head()

C:\Users\Public\anaconda3\lib\site-packages\pandas\core\indexing.py in __getitem__(self, key)
   2078             return self.obj.loc[key]
   2079 
-> 2080         return super().__getitem__(key)
   2081 
   2082     def __setitem__(self, key, value):

C:\Users\Public\anaconda3\lib\site-packages\pandas\core\indexing.py in __getitem__(self, key)
   2025 
   2026         key = self._convert_key(key)
-> 2027         return self.obj._get_value(*key, takeable=self._takeable)
   2028 
   2029     def __setitem__(self, key, value):

C:\Users\Public\anaconda3\lib\site-packages\pandas\core\series.py in _get_value(self, label, takeable)
    987 
    988         # Similar to Index.get_value, but we do not fall back to positional
--> 989         loc = self.index.get_loc(label)
    990         return self.index._get_values_for_loc(self, loc, label)
    991 

C:\Users\Public\anaconda3\lib\site-packages\pandas\core\indexes\range.py in get_loc(self, key, method, tolerance)
    356                 except ValueError as err:
    357                     raise KeyError(key) from err
--> 358             raise KeyError(key)
    359         return super().get_loc(key, method=method, tolerance=tolerance)
    360 

KeyError: (0, 10002)

我做错了什么,可以解决什么问题?

at 用作对其参数给出的索引的访问器。当您将 label, value+2 传递给它时,它会将此参数视为一个 2 元组,并在第一轮查找字面上名为 (0, 10002) 的索引,但它会失败,因为您的系列具有整数索引 0, 1, ... ,不是元组。

所以你可以只在 at 中保留 label 并将 returns 设置为 value + 2:

numbers = pd.Series(np.random.randint(0,1000,10000))

for label, value in numbers.iteritems():
    # lookup the value and set it
    numbers.at[label] = value + 2

(注意这等同于 numbers += 2)。