仅将数字的字符串表示形式转换为熊猫中的数字

时间:2018-09-09 06:03:22

标签: python pandas dataframe

我有一个熊猫Dataframe,我意识到当我的Dataframe列仅具有数字的字符串表示形式时,将进行转换,否则将不进行转换。下面的代码用于将所有字符串形式的数字转换为数字。

import pandas as pd
from functools import partial

df = pd.DataFrame({0: ['3', 'r'], 1: ['1', 's']})
df = df.apply(partial(pd.to_numeric, errors='ignore'))

上面的代码将无效,因为'r''s'在列中。因此,所有内容都将保留为字符串。如何获得将'3''1'转换为数字31的代码?

1 个答案:

答案 0 :(得分:3)

@MadPhysicist所述,Pandas.Series具有单个dtype。但是,dtype可以是object,这意味着一切。拥有数字dtype会失去许多的优势,但这可能正是您想要的。

将非数字内容强制为NaN

df.apply(pd.to_numeric, errors='coerce')

     0    1
0  3.0  1.0
1  NaN  NaN

注意:
apply遍历每列,并将该列通过给定的callable。这意味着每列都会得到这样的处理:

pd.to_numeric(one_of_the_columns, errors='coerce')

使用errors='coerce'会在可能的地方编号,否则使用np.nan


使用dtype对象并放弃效率,以...执行您想做的一切

df = df.applymap(lambda x: pd.to_numeric(x, errors='ignore'))
df

   0  1
0  3  1
1  r  s

要验证其实际上将3更改为数字,请尝试:

df.applymap(type)

                       0                      1
0  <class 'numpy.int64'>  <class 'numpy.int64'>
1          <class 'str'>          <class 'str'>

注意:
applymap遍历数据帧的每个单元格,并通过传递的callable传递该单元格的值。在这种情况下,每个单元格的处理方式如下:

pd.to_numeric(one_particular_cell, errors='ignore')

如果可能的话,将其转换为数字,否则不予处理。

这效率低下,但是可以满足您的要求。当熊猫尝试调和您造成的损害时,它意识到某些列中存在混合类型,因此将dtype更改为object以便适应。