【问题标题】:replacing '-' with np.nan converts the data type to float in pandas用 np.nan 替换 '-' 将数据类型转换为 pandas 中的浮点数
【发布时间】:2021-04-09 21:07:23
【问题描述】:

我有一个熊猫df 如下:

 +------+----+
 |  x   |  y |
 +------+----+
 |ABCD  | -  |           
 |DEFG  | -  |
 +------+----+

xy 的数据类型为对象,使用下面的 nan 替换 '-' 后

df = df.replace('-', np.NaN)

它将y 列的数据类型转换为浮点数,而y 列的数据类型预计保持为对象。此外,当我尝试在替换为 NA 值后找出具有 NA 值的列列表时,它不会显示任何具有 NA 值的列,而 y 列具有 NA 值。为什么会出现这个问题?

编辑:我能够找到具有如下 NA 值的列

df.columns[df.isna().any()].tolist()

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    原因只是列中的NaNs 将列转换为浮点数。可能的解决方案是通过原始dtypes 使用DataFrame.astype

    df = df.replace('-',np.NaN).astype(df.dtypes)
    
    print (df.dtypes)
    x    object
    y    object
    dtype: object
    
    print (df.applymap(type))
                   x                y
    0  <class 'str'>  <class 'float'>
    1  <class 'str'>  <class 'float'>
    

    如果想要缺少值的测试列,请使用:

    print (df.columns[df.isna().any()])
    Index(['y'], dtype='object')
    

    另一个类似的想法是只提取 NaN 列并将它们转换为对象:

    df = df.replace('-',np.NaN)
    
    
    d = dict.fromkeys(df.columns[df.isna().all()], 'object')
    print (d)
    {'y': 'object'}
    
    df = df.astype(d)
    
    print (df.dtypes)
    x    object
    y    object
    dtype: object
    

    【讨论】:

    • 除了您编写的解决方案之外,还有其他替代解决方案吗?
    • @user3046211 - 你能解释一下你的问题吗?为什么不能使用?
    • 它有效,但我很想知道是否存在替代解决方案。
    • @user3046211 - 添加了另一个想法,我认为如果只需将几个(或一个)c olumns 转换为对象会更好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 2011-03-10
    • 2014-02-13
    相关资源
    最近更新 更多