【问题标题】:pandas.DataFrame.replace change dtype of columnspandas.DataFrame.replace 更改列的 dtype
【发布时间】:2020-04-17 10:15:49
【问题描述】:

所以我试图用None 替换我的数据框中的np.nan 值,并注意到在此过程中数据框中的float 列的数据类型更改为object,即使它们不包含任何缺少数据。

举个例子:

import pandas as pd
import numpy as np
data = pd.DataFrame({'A':np.nan,'B':1.096, 'C':1}, index=[0])
data.replace(to_replace={np.nan:None}, inplace=True)

在调用replace 之前和之后调用data.dtypes 表明B 列的数据类型从float 更改为object,而C 的数据类型保持在int。 如果我从不会发生的原始数据中删除 A 列。 我想知道为什么会发生这种变化以及如何避免这种影响。

【问题讨论】:

  • @yatu:为什么要立即关闭?链接的答案没有说明为什么其他不相关的列会在其dtype 中看到变化;如果在替换之前删除了A,则不会出现 OP 中的行为。
  • 是的,没错,重新打开了@fuglede
  • 看起来像一个错误 - 你能在这里报告吗? github.com/pandas-dev/pandas/issues
  • 对我来说看起来有问题。不明白为什么替换 NaNs 也会影响没有缺失值的浮点列。如果您找不到相关问题,我建议您按照@ignoring_gravity 的建议进行报告
  • 纯属推测,但我假设 None 被视为纯字符串 因为存在 np.nan 值,因为在 a 中没有明确定义 None字符串列或数字列,因此默认将其视为对象。

标签: python pandas


【解决方案1】:

当您替换每列并从pd.Series(...) 而不是从pd.DataFrame(...) 调用replace 时,它工作正常。

除了评论中提到的NoneType() 不能转换为float(或int,或任何数字-您宁愿使用NaN),因此它将自动转换为object

import pandas as pd
import numpy as np
data = pd.DataFrame({'A':np.nan,'B':1.096, 'C':1}, index=[0])
print(data)
print(data.dtypes)
for col in data.columns:
    data[col].replace(to_replace={np.nan: None}, inplace=True)
print(data)
print(data.dtypes)

输出:

      A      B  C
0 NaN  1.096  1

A    float64
B    float64
C      int64
dtype: object
      A      B  C
0  None  1.096  1

A     object
B    float64
C      int64
dtype: object

【讨论】:

    【解决方案2】:

    我遇到过很多次,并且有一个解决方法。在您使用 astype(object) 替换之前,它将保留 dtypes。我不得不将它用于合并问题、合并问题等。我不确定为什么它会在以这种方式使用时保留类型,但它确实如此,并且一旦你发现它就会很有用。

    data.info()    
    
    #<class 'pandas.core.frame.DataFrame'>
    #Int64Index: 1 entries, 0 to 0
    #Data columns (total 3 columns):
    #A    0 non-null float64
    #B    1 non-null float64
    #C    1 non-null int64
    #dtypes: float64(2), int64(1)
    #memory usage: 32.0 bytes
    
    import pandas as pd 
    import numpy as np 
    data = pd.DataFrame({'A':np.nan,'B':1.096, 'C':1}, index=[0]) 
    data.replace(to_replace={np.nan:None}, inplace=True)                                                                                                                                 
    
    data.info()   
    
    #<class 'pandas.core.frame.DataFrame'>
    #Int64Index: 1 entries, 0 to 0
    #Data columns (total 3 columns):
    #A    0 non-null object
    #B    1 non-null object
    #C    1 non-null int64
    #dtypes: int64(1), object(2)
    #memory usage: 32.0+ bytes
    
    import pandas as pd 
    import numpy as np 
    data = pd.DataFrame({'A':np.nan,'B':1.096, 'C':1}, index=[0]) 
    data.astype(object).replace(to_replace={np.nan:None}, inplace=True)                                                                                                                  
    
    data.info()                                                                                                                                                                          
    
    #<class 'pandas.core.frame.DataFrame'>
    #Int64Index: 1 entries, 0 to 0
    #Data columns (total 3 columns):
    #A    0 non-null float64
    #B    1 non-null float64
    #C    1 non-null int64
    #dtypes: float64(2), int64(1)
    #memory usage: 32.0 bytes
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 2012-04-14
      • 2011-04-23
      • 2013-01-06
      • 2017-08-12
      相关资源
      最近更新 更多