【问题标题】:ValueError when assigning nan values using DataFrame.at in an integer data frame in pandas在 Pandas 的整数数据框中使用 DataFrame.at 分配 nan 值时出现 ValueError
【发布时间】:2018-11-02 15:24:33
【问题描述】:

我有以下由整数值组成的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

【问题讨论】:

    标签: python pandas dataframe missing-data


    【解决方案1】:

    如果设置NaNs,函数DataFrame.at 似乎无法将整数转换为浮点数。

    为我工作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 解释:

    首先需要进行任何类型转换的原因是因为 nanfloat 类型,而 int 数据类型不支持 nan 或任何其他缺失值。为了使数值列包含 nan,它必须是 float 类型。

    @pir 解释:

    pandas.DataFrame.at 针对特定小区访问进行了优化。因此它不能改变列的 dtype。但是,loc 可以。

    【讨论】:

    • pandas.DataFrame.at 针对特定小区访问进行了优化。因此它不能更改列的dtype。但是,loc 可以。
    • 为了扩展这个答案,首先需要进行任何类型转换的原因是因为nan 的类型为float,而int 数据类型不支持nan 或任何其他缺失值。为了使数字列包含nan,它的类型必须是float
    【解决方案2】:

    添加astype

    df.a=df.a.astype(float)
    df.at[1,'a']=np.nan
    df
    Out[43]: 
         a  b
    1  NaN  1
    2  1.0  1
    3  1.0  1
    

    【讨论】:

    • 然后可以将原始数据框重新定义为df = pd.DataFrame(data=1.0, columns=['a','b'], index=[1,2,3])
    猜你喜欢
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 2019-06-17
    • 2016-02-11
    • 1970-01-01
    • 2021-04-12
    相关资源
    最近更新 更多