100天精通Python(数据分析篇)——第76天:Pandas数据类型转换函数pd.to_numeric(参数说明+实战案例)

专栏导读

  • 🏆🏆作者介绍:Python领域优质创作者、CSDN/华为云/阿里云/掘金/知乎等平台专家博主

  • 🔥🔥本文已收录于Python全栈系列专栏《100天精通Python从入门到就业》
  • 📝​📝​此专栏文章是专门针对Python零基础小白所准备的一套完整教学,从0到100的不断进阶深入的学习,各知识点环环相扣
  • 🎉🎉订阅专栏后续可以阅读Python从入门到就业100篇文章还可私聊进千人Python全栈交流群(手把手教学,问题解答); 进群可领取80GPython全栈教程视频 + 300本计算机书籍:基础、Web、爬虫、数据分析、可视化、机器学习、深度学习、人工智能、算法、面试题等。
  • 🚀🚀加入我一起学习进步,一个人可以走的很快,一群人才能走的更远!

在这里插入图片描述
在这里插入图片描述

一、to_numeric参数说明

数据处理、分析等操作的首要操作是我们正确地设置了数据类型,经常也会遇到事先没有处理好数据类型,而造成无法进行后续操作的困扰。而Pandas提供数据转换的函数如to_numeric(),本文将介绍to_numeric()的参数说明和实战案例

0. 介绍

to_numeric()的作用:

  • 将参数转换为数字类型。

  • 默认返回dtype为float64或int64, 具体取决于提供的数据。使用downcast参数获取其他dtype。

语法格式

pandas.to_numeric(arg, errors='raise', downcast=None)

1. arg

scalar(标量),list(列表),(tuple)元组,一维数组(1-d array)或Series

1)接收列表

import numpy as np
import pandas as pd


a = pd.to_numeric(['1.0', '2', -3])
print(a)
print(type(a))

运行结果:
在这里插入图片描述

2)接收一维数组

import numpy as np
import pandas as pd


t1 = np.array(range(10))
print(t1)
print(type(t1))
print()
a = pd.to_numeric(t1)
print(a)
print(type(a))

运行结果:
在这里插入图片描述

3)接收Series对象

import numpy as np
import pandas as pd

s = pd.Series(['1.0', '2', -3])
a = pd.to_numeric(s)
print(a)
print(type(a))

运行结果:
在这里插入图片描述

2. errors

可传入 {‘ignore’, ‘raise’, ‘coerce’}, 默认 ‘raise’,如果无法解析数据的处理方案。

  • 'raise':如果无法解析将引发异常,通常情况下很少使用
  • 'coerce':如果无法解析将设置为 NaN
  • 'ignore':如果无效解析将返回输入

1)errors='coerce'

import numpy as np
import pandas as pd

s = pd.Series(['abc', '1.0', '2', -3, None, np.NaN])
a = pd.to_numeric(s, errors = 'coerce')
print(a)
print(type(a))

运行结果:
在这里插入图片描述

2)errors = 'ignore'

import numpy as np
import pandas as pd

s = pd.Series(['abc', '1.0', '2', -3, None, np.NaN])
a = pd.to_numeric(s, errors = 'ignore')
print(a)
print(type(a))

运行结果:
在这里插入图片描述

3. downcast

降级处理、向下转换。可传入{‘integer’,‘signed’,‘unsigned’,‘float’},默认为None。如果不是None(无),并且数据已成功转换为数字dtype(或者数据是从数字开始的),则根据以下规则将结果数据转换为可能的最小数字dtype:

  • 'integer''signed':最小的有符号int dtype(最小值:np.int8)
  • 'unsigned':最小的无符号int dtype(最小值:np.uint8)
  • 'float':最小的float dtype(最小值:np.float32)

注意事项

  • 由于此行为与从核心转换为数值的行为是分开的,因此无论 ‘errors’ 输入的值如何,向下转换期间引发的任何错误都会浮出水面。
  • 此外,仅当结果数据的dtype的大小,严格大于要强制转换为dtype的dtype时,才会发生向下转换,因此,如果检查的所有dtype都不满足该规范,则不会对该数据执行向下转换。
  • 0.19.0版中才有的新功能。

1)downcast=‘integer’

import numpy as np
import pandas as pd

s = pd.Series([-1, 0, 1, 2, 3], dtype="Int64")
a = pd.to_numeric(s, downcast='integer')
print(a)
print(type(a))

运行结果:
在这里插入图片描述

2)downcast=‘signed’

import numpy as np
import pandas as pd

s = pd.Series([-1, 0, 1, 2, 3], dtype="Int64")
a = pd.to_numeric(s, downcast='signed')
print(a)
print(type(a))

运行结果:
在这里插入图片描述

3)downcast=‘float’

import numpy as np
import pandas as pd

s = pd.Series([-1.0, 0.0, 1.1, 2.2, 3.3], dtype="Float64")
a = pd.to_numeric(s, downcast='float')
print(a)
print(type(a))

运行结果:

在这里插入图片描述

4. 返回值

解析成功时为numeric(数字)。返回类型取决于输入:

  • 输入Series:返回Series
  • 否则都是返回ndarray。

5. 注意事项

请注意,如果传入非常大的数字,则可能会导致精度损失。由于ndarray的内部限制,如果数字小于-9223372036854775808(np.iinfo(np.int64).min)或大于18446744073709551615(np.iinfo(np.uint64).max)传入,很有可能会将它们转换为float以便将其存储在ndarray中。这些警告类似地适用于 Series,因为它在内部利用ndarray。

6. 相关方法

DataFrame.astype:将参数转换为指定的 dtype。

to_datetime:将参数转换为日期时间。

to_timedelta : 将参数转换为 timedelta。

numpy.ndarray.astype :将 numpy 数组转换为指定类型。

DataFrame.convert_dtypes:转换 dtypes。

二、实战案例

0. 导入数据

这里我们模拟的一份总收入数据,包含三个字段名称:

在这里插入图片描述

import numpy as np
import pandas as pd


df = pd.read_excel(r'E:\Python学习\收入表.xlsx')
df

运行结果:
在这里插入图片描述

1. 数据类型查看

1)各字段的数据类型

df.dtypes # 各字段的数据类型

运行结果:
在这里插入图片描述

2)各类型有多少个字段

df.dtypes.value_counts() # 各类型有多少个字段

运行结果:
在这里插入图片描述

2. 错误操作

比如我们想在数据上进行一些操作,比如将"2021年总收入"、和"2022年总收入"的数据相加:很明显数据不是我们想要的结果。

在这里插入图片描述

根本原因:这两个字段是字符类型,进行+操作,是直接将里面的内容拼接在一起,而不是里面数值的相加。

3. 正确操作

1)提取数字

先把这两个字段中的数字单独提取出来

# 分割之后取出第1个元素

df["2021年_新"] = df["2021年总收入"].apply(lambda x:x.split("元")[0])
df["2022年_新"] = df["2022年总收入"].apply(lambda x:x.split("元")[0])
df

运行结果:
在这里插入图片描述

2)再次查看类型

生成的两个新字段仍然是object类型,不能直接相加

df.dtypes # 各字段的数据类型

运行结果:
在这里插入图片描述

3)使用to_numeric转换类型

将数字表现型的字符型数据转成数值型

df['2021年_新'] = pd.to_numeric(df['2021年_新'])  
df['2022年_新'] = pd.to_numeric(df['2022年_新'])  
df.dtypes # 各字段的数据类型

运行结果:
在这里插入图片描述

4)数值相加

df['两年总收入'] = df['2021年_新'] + df['2022年_新'] 
df

运行结果:
在这里插入图片描述

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2023年3月2日 下午10:47
下一篇 2023年3月2日 下午10:48

相关推荐