您可以使用
pd.to_numeric(在版本0.17中引入)将列或Series转换为数字类型。该函数还可以使用apply应用于DataFrame的多个列。
重要的是,该函数还接受一个错误关键字参数,它允许您强制非数字值为NaN,或者简单地忽略包含这些值的列。
示例使用如下所示。
单列/系列
这里有一个使用一系列字符串的例子,它有一个对象dtype:
>>> s = pd.Series(['1', '2', '4.7', 'pandas', '10'])
>>> s
0 1
1 2
2 4.7
3 pandas
4 10
dtype: object
该函数的默认行为是,如果它不能转换一个值。在这种情况下,它不能处理字符串’熊猫’:
>>> pd.to_numeric(s) # or pd.to_numeric(s, errors='raise')
ValueError: Unable to parse string
而不是失败,我们可能想要“熊猫”被认为是一个缺失/坏值。我们可以强制无效值到NaN,如下所示:
>>> pd.to_numeric(s, errors='coerce')
0 1.0
1 2.0
2 4.7
3 NaN
4 10.0
dtype: float64
第三个选项只是在遇到无效值时忽略操作:
>>> pd.to_numeric(s, errors='ignore')
# the original Series is returned untouched
多列/整个DataFrames
我们可能希望将此操作应用于多个列。依次处理每一列是乏味的,所以我们可以使用DataFrame.apply使该函数对每一列起作用。
借用DataFrame的问题:
>>> a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
>>> df = pd.DataFrame(a, columns=['col1','col2','col3'])
>>> df
col1 col2 col3
0 a 1.2 4.2
1 b 70 0.03
2 x 5 0
然后我们可以写:
df[['col2','col3']] = df[['col2','col3']].apply(pd.to_numeric)
现在“col2”和“col3”根据需要具有dtype float64。
但是,我们可能不知道哪些列可以可靠地转换为数字类型。在这种情况下,我们可以写:
df.apply(lambda x: pd.to_numeric(x, errors='ignore'))
然后该函数将应用于整个DataFrame。可以转换为数字类型的列将被转换,而不能(例如,它们包含非数字字符串或日期)的列将被单独保留。
还有用于转换为日期和时间戳的pd.to_datetime和pd.to_timedelta。