我有一个熊猫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'
转换为数字3
和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
以便适应。