Skip to main content
 首页 » 编程设计

python之在 Pandas 的整数数据框中使用 DataFrame.at 分配 nan 值时出现 ValueError

2025年05月04日8shanyou

我有以下由整数值组成的 DataFrame:

df = pd.DataFrame(data=1, columns=['a','b'], index=[1,2,3]) 
 
   a  b 
1  1  1 
2  1  1 
3  1  1 

我想在单个单元格上设置缺失值,当我尝试时:

df.at[1,'a'] = np.nan 

然后我得到这个异常:

Traceback (most recent call last): 
  File "<input>", line 1, in <module> 
  File "pandas/core/indexing.py", line 2159, in __setitem__ 
    self.obj._set_value(*key, takeable=self._takeable) 
  File "pandas/core/frame.py", line 2582, in _set_value 
    engine.set_value(series._values, index, value) 
  File "pandas/_libs/index.pyx", line 124, in pandas._libs.index.IndexEngine.set_value 
  File "pandas/_libs/index.pyx", line 133, in pandas._libs.index.IndexEngine.set_value 
  File "pandas/_libs/index.pyx", line 570, in pandas._libs.index.convert_scalar 
ValueError: Cannot assign nan to integer series 

请您参考如下方法:

好像函数DataFrame.at如果设置 NaN,则无法将整数转换为 float 。

为我工作DataFrame.loc :

df.loc[1,'a'] = np.nan 
print (df) 
     a  b 
1  NaN  1 
2  1.0  1 
3  1.0  1 

@Peter Leimbigler 解释:

The reason why any type-casting is needed in the first place is because nan is of type float, and the int data type has no support for nan or any other missing value. In order for a numeric column to contain nan, it must be of type float.

@pir 解释:

pandas.DataFrame.at is optimized for specific cell access. Therefore it cannot change the dtype of the column. However, loc can.