Pandas pd.to-numeric() 函数
pd.to_numeric() 是 Pandas 库中用于将数据转换为数值类型的函数。它可以将各种格式的数据(如字符串、混合类型列)转换为整数、浮点数等数值类型。
这是数据清洗中的常用函数,特别是在处理从文件或数据库导入的数据时,经常需要将看似数值但实际是字符串的列转换过来。
单词释义: to_numeric 意为"转换为数值",即将数据从其他类型转换为数值类型。
基本语法与参数
pd.to_numeric() 是 Pandas 库的顶级函数,用于将输入转换为数值类型。
语法格式
pd.to_numeric(arg, errors='raise', downcast=None)
参数说明
- 参数:
arg- 类型: Series、列表、数组或类字典对象。
- 描述: 要转换为数值类型的数据。通常是一个 Series。
- 参数:
errors- 类型: 字符串('raise', 'coerce', 'ignore')。
- 描述: 错误处理方式。
'raise'(默认)遇到无法转换的值时抛出异常;'coerce'将无法转换的值设为 NaN;'ignore'忽略错误,返回原始数据。
- 参数:
downcast- 类型: 字符串('integer', 'signed', 'unsigned', 'float')或 None。
函数说明
- 返回值: 返回一个数值型的 Series。
- 效果: 将输入数据的类型转换为数值型(int64 或 float64)。
实例
让我们通过一系列从简单到复杂的例子,彻底掌握 pd.to_numeric() 的用法。
示例 1:基础用法 - 将字符串转换为数值
实例
import pandas as pd
# 1. 创建包含数值字符串的 Series
s = pd.Series(['10', '20', '30', '40', '50'])
print("=== 原始 Series(类型:", s.dtype, ")===")
print(s)
# 2. 使用 pd.to_numeric() 转换为数值类型
result = pd.to_numeric(s)
print("\n=== pd.to_numeric() 转换后(类型:", result.dtype, ")===")
print(result)
# 1. 创建包含数值字符串的 Series
s = pd.Series(['10', '20', '30', '40', '50'])
print("=== 原始 Series(类型:", s.dtype, ")===")
print(s)
# 2. 使用 pd.to_numeric() 转换为数值类型
result = pd.to_numeric(s)
print("\n=== pd.to_numeric() 转换后(类型:", result.dtype, ")===")
print(result)
运行结果预期:
=== 原始 Series(类型: object )=== 0 10 1 20 2 30 3 40 5 50 dtype: object === pd.to_numeric() 转换后(类型: int64 )=== 0 10 1 20 2 30 3 40 4 50 dtype: int64
代码解析:
- 原始数据是字符串类型(object),无法进行数值运算。
pd.to_numeric()将其转换为整数类型(int64),可以进行数学运算。
示例 2:处理包含非数值的字符串
使用 errors 参数可以灵活处理无法转换的值。
实例
import pandas as pd
import numpy as np
# 1. 创建包含非数值字符串的 Series
s = pd.Series(['10', '20', 'abc', '40', 'runoob'])
print("=== 包含非数值的 Series ===")
print(s)
# 2. errors='raise'(默认)- 遇到无法转换的值时抛出异常
print("\n=== errors='raise'(默认)===")
try:
result = pd.to_numeric(s, errors='raise')
except Exception as e:
print(f"异常: {e}")
# 3. errors='coerce' - 将无法转换的值设为 NaN
print("\n=== errors='coerce' ===")
result_coerce = pd.to_numeric(s, errors='coerce')
print(result_coerce)
# 4. errors='ignore' - 忽略错误,返回原始数据
print("\n=== errors='ignore' ===")
result_ignore = pd.to_numeric(s, errors='ignore')
print(result_ignore)
print(f"类型: {result_ignore.dtype}")
import numpy as np
# 1. 创建包含非数值字符串的 Series
s = pd.Series(['10', '20', 'abc', '40', 'runoob'])
print("=== 包含非数值的 Series ===")
print(s)
# 2. errors='raise'(默认)- 遇到无法转换的值时抛出异常
print("\n=== errors='raise'(默认)===")
try:
result = pd.to_numeric(s, errors='raise')
except Exception as e:
print(f"异常: {e}")
# 3. errors='coerce' - 将无法转换的值设为 NaN
print("\n=== errors='coerce' ===")
result_coerce = pd.to_numeric(s, errors='coerce')
print(result_coerce)
# 4. errors='ignore' - 忽略错误,返回原始数据
print("\n=== errors='ignore' ===")
result_ignore = pd.to_numeric(s, errors='ignore')
print(result_ignore)
print(f"类型: {result_ignore.dtype}")
运行结果预期:
=== 包含非数值的 Series === 0 10 1 20 2 abc 3 40 4 runoob 包含了 'abc', 'runoob' 等无法转换的字符串 === errors='raise'(默认)=== 异常: Unable to convert string to float explicitly === errors='coerce' === 0 10.0 1 20.0 2 NaN 3 40.0 4 NaN dtype: float64 === errors='ignore' === 0 10 1 20 2 abc 3 40 4 runoob 类型: object
代码解析:
errors='coerce'非常实用,将无法转换的值替换为 NaN(缺失值),保留可转换的值。errors='ignore'保持原始数据不变,适合只想尝试转换但不希望改变数据的情况。
示例 3:处理混合数值和缺失值
在实际数据中,经常需要处理包含缺失值和数值混合的列。
实例
import pandas as pd
import numpy as np
# 1. 创建包含缺失值和数值字符串的 Series
s = pd.Series(['100', '200', None, 'N/A', '400', '', '500'])
print("=== 包含缺失值和非数值的 Series ===")
print(s)
# 2. 使用 errors='coerce' 转换
print("\n=== 使用 errors='coerce' 转换 ===")
result = pd.to_numeric(s, errors='coerce')
print(result)
# 3. 查看哪些值被转换为 NaN
print("\n=== 识别 NaN 值 ===")
print(f"NaN 位置: {result.isna().tolist()}")
# 4. 将 NaN 填充为 0 或删除
print("\n=== 填充 NaN 为 0 ===")
print(result.fillna(0))
import numpy as np
# 1. 创建包含缺失值和数值字符串的 Series
s = pd.Series(['100', '200', None, 'N/A', '400', '', '500'])
print("=== 包含缺失值和非数值的 Series ===")
print(s)
# 2. 使用 errors='coerce' 转换
print("\n=== 使用 errors='coerce' 转换 ===")
result = pd.to_numeric(s, errors='coerce')
print(result)
# 3. 查看哪些值被转换为 NaN
print("\n=== 识别 NaN 值 ===")
print(f"NaN 位置: {result.isna().tolist()}")
# 4. 将 NaN 填充为 0 或删除
print("\n=== 填充 NaN 为 0 ===")
print(result.fillna(0))
运行结果预期:
=== 包含缺失值和数值字符串的 Series === 0 100 1 200 2 None 3 N/A 4 400 5 (空字符串) 6 字符串 '500' dtype: object === 使用 errors='coerce' 转换 === 0 100.0 1 200.0 даль 2 NaN 3. NaN 4 400.0 5 NaN 6 NaN dtype: float64
代码解析:
errors='coerce'能够处理 None、空字符串、N/A 等各种表示缺失值的形式,将它们统一转换为 NaN。- 转换后的类型变为 float64(因为需要表示 NaN)。
示例 4:使用 downcast 参数优化内存
对于大型数据集,可以使用 downcast 参数减少内存占用。
实例
import pandas as pd
import numpy as np
# 1. 创建大整数 Series
s = pd.Series([1, 2, 3, 4, 5] * 100000)
print("=== 原始类型:", s.dtype)
print("=== 原始内存:", s.memory_usage(deep=True), "bytes")
# 2. 转换为数值但不指定 downcast
result_default = pd.to_numeric(s)
print("\n=== 默认转换后类型:", result_default.dtype)
print("=== 默认内存:", result_default.memory_usage(deep=True), "bytes")
# 3. 向下转换为更小的整数类型
result_signed = pd.to_numeric(s, downcast='signed')
print("\n=== downcast='signed' 类型:", result_signed.dtype)
print("=== downcast='signed' 内存:", result_signed.memory_usage(deep=True), "bytes")
# 4. 向下转换为浮点数
float_data = pd.Series([1.5, 2.5, 3.5] * 100000)
result_float = pd.to_numeric(float_data, downcast='float')
print("\n=== downcast='float' 类型:", result_float.dtype)
print("=== downcast='float' 内存:", result_float.memory_usage(deep=True), "bytes")
import numpy as np
# 1. 创建大整数 Series
s = pd.Series([1, 2, 3, 4, 5] * 100000)
print("=== 原始类型:", s.dtype)
print("=== 原始内存:", s.memory_usage(deep=True), "bytes")
# 2. 转换为数值但不指定 downcast
result_default = pd.to_numeric(s)
print("\n=== 默认转换后类型:", result_default.dtype)
print("=== 默认内存:", result_default.memory_usage(deep=True), "bytes")
# 3. 向下转换为更小的整数类型
result_signed = pd.to_numeric(s, downcast='signed')
print("\n=== downcast='signed' 类型:", result_signed.dtype)
print("=== downcast='signed' 内存:", result_signed.memory_usage(deep=True), "bytes")
# 4. 向下转换为浮点数
float_data = pd.Series([1.5, 2.5, 3.5] * 100000)
result_float = pd.to_numeric(float_data, downcast='float')
print("\n=== downcast='float' 类型:", result_float.dtype)
print("=== downcast='float' 内存:", result_float.memory_usage(deep=True), "bytes")
运行结果预期:
=== 原始类型: int64 === 原始内存: 2800000 bytes === 默认转换后类型: int64 内存节省:2.8 MB -> 1.4 MB === downcast='signed' 类型: int8/int16/int32 内存节省约 50% === downcast='float' 类型: float32 内存节省约 50%
代码解析:
- 对于大型数据集,
downcast可以显著减少内存占用。 downcast='signed'尝试将整数转换为最小有符号整数类型。downcast='float'将浮点数从 float64 转换为 float32。
提示: 处理大规模数据时,
pd.to_numeric()结合errors='coerce'和downcast参数可以高效地将混合数据转换为数值类型并优化内存。

Pandas 常用函数