【问题标题】:Pandas ".convert_objects(convert_numeric=True)" deprecated [duplicate]熊猫“.convert_objects(convert_numeric = True)”已弃用[重复]
【发布时间】:2016-01-12 14:37:21
【问题描述】:

我的代码中有这一行,它将我的数据转换为数字...

data["S1Q2I"] = data["S1Q2I"].convert_objects(convert_numeric=True)

问题是现在新的 pandas 版本(0.17.0)说这个功能已被弃用.. 这是错误:

FutureWarning: convert_objects is deprecated.  
Use the data-type specific converters pd.to_datetime, 
pd.to_timedelta and pd.to_numeric. 
data["S3BD5Q2A"] = data["S3BD5Q2A"].convert_objects(convert_numeric=True)

所以,我去了新文档,但找不到任何关于如何使用新函数转换数据的示例...

它只是这样说的:

“DataFrame.convert_objects 已被弃用,取而代之的是特定类型的函数 pd.to_datetime、pd.to_timestamp 和 pd.to_numeric(0.17.0 中的新功能)(GH11133)。”

任何帮助都会很好!

【问题讨论】:

  • 您的意思是thisthis?您希望这会做什么/不做什么?
  • 就是这样:data['S1Q2I'] = pd.to_numeric(data['S1Q2I'])
  • 如果可以的话,如果我想转换整个 DataFrame 怎么办? .convert_objects 将作用于 DataFrame,但 .to_numeric 仅作用于 Series。
  • 相同的请求。如何转换整个 DataFrame ?
  • 新的首选方法根本不捕获.convert_objects 的功能,它可以推断数据类型。如果您事先不知道列的类型,这很重要。

标签: python pandas


【解决方案1】:

正如@EvanWright 在 cmets 中所解释的,

data['S1Q2I'] = pd.to_numeric(data['S1Q2I'])

现在是转换类型的首选方式。更改的详细说明可以在 github PR GH11133 中找到。

【讨论】:

    【解决方案2】:

    您可以使用 apply as done here 来实现替换。一个例子是:

    >>> import pandas as pd
    >>> a = pd.DataFrame([{"letter":"a", "number":"1"},{"letter":"b", "number":"2"}])
    >>> a.dtypes
    letter    object
    number    object
    dtype: object
    >>> b = a.apply(pd.to_numeric, errors="ignore")
    >>> b.dtypes
    letter    object
    number     int64
    dtype: object
    >>> 
    

    但它在两个方面很糟糕:

    1. 您必须使用 apply 而不是非本地数据框方法
    2. 您必须复制到另一个数据框 - 无法在原地完成。非常适合与“大数据”一起使用。

    我并不是很喜欢 pandas 的发展方向。 R data.table 我用的不多,但到目前为止它似乎更胜一筹。

    我认为具有原生、就地类型转换的数据表对于竞争性数据分析框架来说是非常基础的。

    【讨论】:

      【解决方案3】:

      您可以让它正确地应用于数据框中的特定变量名称,而不必像这样复制到不同的数据框中:

      >>> import pandas as pd
      >>> a = pd.DataFrame([{"letter":"a", "number":"1"},{"letter":"b", "number":"2"}])
      >>> a.dtypes
      letter    object
      number    object
      dtype: object
      >>> a['number'] = a['number'].apply(pd.to_numeric, errors='coerce')
      >>> a.dtypes
      letter    object
      number     int64
      dtype: object
      

      基于上述原始问题的示例如下:

      data['S1Q2I'] = data['S1Q2I'].apply(pd.to_numeric, errors='coerce')
      

      这与您原来的工作方式相同:

      data['S1Q2I'] = data['S1Q2I'].convert_objects(convert_numeric=True)
      

      反正在我手里……

      这并没有解决 abalter 关于推断数据类型的观点,我担心这有点超出我的想象!

      【讨论】:

      • 啊,我刚刚阅读了here 的讨论,现在很欣赏这些限制。最烦人。但是,如果您有一个特定的数据框列要转换,那么您可以这样做。
      【解决方案4】:

      这取决于熊猫的哪个版本...... 如果你有 Pandas 的 0.18.0 版本 这种类型可以工作........

      df['col name'] = df['col name'].apply(pd.to_numeric, errors='coerce') 
      

      其他版本........

      df['col name']=df.col name .astype(float)
      

      【讨论】:

        【解决方案5】:

        如果您一次将所有列转换为数字,则此代码可能有效。

        data = data.apply(pd.to_numeric, axis=0)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-12-14
          • 1970-01-01
          • 2018-12-15
          • 1970-01-01
          • 2020-05-09
          • 2019-08-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多