【问题标题】:How to replace <NA> values with np.nan -- file imported using Pandas read_pickle()如何用 np.nan 替换 <NA> 值——使用 Pandas read_pickle() 导入的文件
【发布时间】:2021-02-04 10:42:17
【问题描述】:

我通过使用pd.read_pickle() 导入pickle ('P') 文件创建了Pandas Data frame。下面是数据框的头部信息。看起来&lt;NA&gt; 值是在没有数据的地方创建的。我想将这些&lt;NA&gt; 值转换为np.nan

sequels = pd.read_pickle('D:\Learning\Datacamp\Datasets/sequels.p')
print(sequels.head())
      id         title  sequel
0  19995        Avatar    <NA>
1    862     Toy Story     863
2    863   Toy Story 2   10193
3    597       Titanic    <NA>
4  24428  The Avengers    <NA>

我尝试过使用几种方法 - sequels.replace('&lt;NA&gt;', np.nan), sequels.fillna(np.nan) 和使用正则表达式 - sequels.replace(r'^\s*$', np.nan, regex=True)

在所有这些情况下,值都不会被替换。有什么建议吗?

【问题讨论】:

    标签: pandas numpy pickle


    【解决方案1】:

    如果将缺失值NaN 替换为浮点数得到np.nan,因为在原始列中使用了integer na

    df['sequel'] = df['sequel'].astype('float')
    print (df)
          id         title   sequel
    0  19995        Avatar      NaN
    1    862     Toy Story    863.0
    2    863   Toy Story 2  10193.0
    3    597       Titanic      NaN
    4  24428  The Avengers      NaN
    

    replace 的解决方案:

    df['sequel'] = df['sequel'].replace({pd.NA: np.nan})
    
    print (df)
          id         title   sequel
    0  19995        Avatar      NaN
    1    862     Toy Story    863.0
    2    863   Toy Story 2  10193.0
    3    597       Titanic      NaN
    4  24428  The Avengers      NaN
    

    或者:

     df['sequel'].replace({pd.NA: np.nan}, inplace=True)
    

    【讨论】:

    • 非常感谢@jezrael :)。有用。然而,一个查询。 sequel 列是 int64 类型;为什么要设置float类型?
    • @Srinivas - 因为np.nan 是浮点数,所以如果至少有一个np.nan,那么列的所有值都需要浮点数
    • df['sequel'].replace({pd.NA: np.nan}) - 这不会替换 值。他们仍然存在。
    • @Srinivas - 如果像df['sequel'] = df['sequel'].replace({pd.NA: np.nan})一样分配回来?
    • 或者如果我们在 replace 方法中添加 'inplace= True' 就可以了。
    【解决方案2】:

    另一个选项是使用替换:

          id         title  sequel
    0  19995        Avatar    <NA>
    1    862     Toy Story     863
    2    863   Toy Story 2   10193
    3    597       Titanic    <NA>
    4  24428  The Avengers    <NA>
    
    df['sequel'].replace({'<NA>': np.nan}, inplace = True)
    

    【讨论】:

    • 这会导致 TypeError: Cannot compare types 'ndarray(dtype=object)' and 'str'
    猜你喜欢
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    相关资源
    最近更新 更多