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