首页 > 解决方案 > 仅将数字的字符串表示形式转换为 Pandas 中的数字

问题描述

我有一个熊猫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

标签: pythonpandasdataframe

解决方案


正如@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')

如果可能的话被变成一个数字,否则就不管了。

这是低效的,但可以做你想做的事。当 Pandas 试图调和您造成的损害时,它意识到某些列中存在混合类型并更改为dtypeobject适应。


推荐阅读