由于 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
)。
我是 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
)。