Pandas" .convert_objects(convert_numeric = True)"弃用

时间:2015-10-14 13:20:17

标签: python pandas

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

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)。"

任何帮助都会很好!

5 个答案:

答案 0 :(得分:14)

正如@EvanWright在评论中解释的那样,

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

现在是转换类型的首选方式。有关更改的详细说明,请参阅github PR GH11133

答案 1 :(得分:5)

您可以使用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. 您必须复制到另一个数据框 - 无法完成。非常适合与“大数据”一起使用。
  3. 我真的不喜欢熊猫的方向。我没有使用过R data.table,但到目前为止它似乎更优越。

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

答案 2 :(得分:2)

这取决于哪个版本的熊猫...... 如果你有Pandas的0.18.0版本 这种类型会起作用........

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

另一个版本........

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

答案 3 :(得分:0)

您可以将其正确应用于数据框中的特定变量名称,而无需复制到不同的数据框中,如下所示:

>>> 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)
无论如何,在我手中......

这并没有解决关于推断数据类型的问题,这有点超出我的头脑,我害怕!

答案 4 :(得分:0)

如果您一次将所有列都转换为数字,则此代码可能会起作用。

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