Pandas 数据类型怎么转换为字符串或者数值类型?

1 转换为字符串对象

在tips数据中,sex、smoker、day 和 time 变量都是category类型。通常,如果变量不是数值类型,应先将其转换成字符串类型以便后续处理

有些数据集中可能含有id列,id的值虽然是数字,但对id进行计算(求和,求平均等)没有任何意义,在某些情况下,可能需要把它们转换为字符串对象类型。

把一列的数据类型转换为字符串,可以使用astype方法。

tips['sex_str'] = tips['sex'].astype(str)

Python内置了str、float、int、complex和bool几种数据类型。此外还可以指定Numpy库支持的任何dtype,查看dtypes,会看到tips多出了object类型

tips.dtypes
显示结果
total_bill     float64
tip            float64
sex           category
smoker        category
day           category
time          category
size             int64
sex_str         object
dtype: object

2 转换为数值类型

astype方法是通用函数,可用于把DataFrame中的任何列转换为其他dtype

可以向astype方法提供任何内置类型或numpy类型来转换列的数据类型

#把total_bill转换成字符串
tips['total_bill'] = tips['total_bill'].astype(str)
tips.dtypes
显示结果
total_bill      object
tip            float64
sex           category
smoker        category
day           category
time          category
size             int64
sex_str         object
dtype: object


#把total_bill转换回float类型
tips['total_bill'] = tips['total_bill'].astype(float)
tips.dtypes
显示结果
total_bill     float64
tip            float64
sex           category
smoker        category
day           category
time          category
size             int64
sex_str         object
dtype: object

to_numeric函数

如果想把变量转换为数值类型(int,float),还可以使用pandas的to_numeric函数

  • DataFrame每一列的数据类型必须相同,当有些数据中有缺失,但不是NaN时(如missing,null等),会使整列数据变成字符串类型而不是数值型,这个时候可以使用to_numeric处理
#创造包含'missing'为缺失值的数据
tips_sub_miss = tips.head(10)
tips_sub_miss.loc[[1,3,5,7],'total_bill'] = 'missing'
tips_sub_miss
显示结果
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 missing 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 missing 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
5 missing 4.71 Male No Sun Dinner 4
6 8.77 2.00 Male No Sun Dinner 2
7 missing 3.12 Male No Sun Dinner 4
8 15.04 1.96 Male No Sun Dinner 2
9 14.78 3.23 Male No Sun Dinner 2
#查看数据类型 dtypes 会发现total_bill列变成了字符串对象类型
tips_sub_miss.dtypes
显示结果
total_bill object
tip float64
sex category
smoker category
day category
time category
size int64
dtype: object

对上面的数据集使用astype方法把total_bill 列转换回float类型,会抛错, Pandas 无法把'missing'转换成float

tips_sub_miss['total_bill'].astype(float)
显示结果
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-8-3aba35b22fb4> in <module>
----> 1 tips_sub_miss['total_bill'].astype(float)
... ....
ValueError: could not convert string to float: 'missing'

如果使用Pandas库中的to_numeric函数进行转换,也会得到类似的错误

pd.to_numeric(tips_sub_miss['total_bill'])
显示结果
ValueError                                Traceback (most recent call last)
pandas\_libs\lib.pyx in pandas._libs.lib.maybe_convert_numeric()
ValueError: Unable to parse string "missing"
During handling of the above exception, another exception occurred:
ValueError                                Traceback (most recent call last)
<ipython-input-9-4fcf9a4ed513> in <module>
----> 1 pd.to_numeric(tips_sub_miss['total_bill'])
~\anaconda3\lib\site-packages\pandas\core\tools\numeric.py in to_numeric(arg, errors, downcast)
148         try:
149             values = lib.maybe_convert_numeric(
--> 150                 values, set(), coerce_numeric=coerce_numeric
151             )
152         except (ValueError, TypeError):
pandas\_libs\lib.pyx in pandas._libs.lib.maybe_convert_numeric()
ValueError: Unable to parse string "missing" at position 1

to_numeric函数有一个参数errors,它决定了当该函数遇到无法转换的数值时该如何处理

    • 默认情况下,该值为raise,如果to_numeric遇到无法转换的值时,会抛错
    • coerce: 如果to_numeric遇到无法转换的值时,会返回NaN
    • ignore: 如果to_numeric遇到无法转换的值时会放弃转换,什么都不做
pd.to_numeric(tips_sub_miss['total_bill'],errors = 'ignore')
显示结果
0 16.99
1    missing
2 21.01
3    missing
4 24.59
5    missing
6 8.77
7    missing
8 15.04
9 14.78
Name: total_bill, dtype: object


pd.to_numeric(tips_sub_miss['total_bill'],errors = 'coerce')
显示结果
0 16.99
1      NaN
2 21.01
3      NaN
4 24.59
5      NaN
6 8.77
7      NaN
8 15.04
9 14.78
Name: total_bill, dtype: float64

to_numeric向下转型

  • to_numeric函数还有一个downcast参数, downcast接受的参数为 'integer','signed','float','unsigned'
  • downcast参数设置为float之后, total_bill的数据类型由float64变为float32
pd.to_numeric(tips_sub_miss['total_bill'],errors = 'coerce',downcast='float')
显示结果
0 16.99
1      NaN
2 21.01
3      NaN
4 24.59