现在位置: 首页 > Pandas 教程 > 正文

Pandas pd.to-numeric() 函数

Pandas 通用函数 Pandas 常用函数


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)

运行结果预期:

=== 原始 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

代码解析:

  1. 原始数据是字符串类型(object),无法进行数值运算。
  2. 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}")

运行结果预期:

=== 包含非数值的 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))

运行结果预期:

=== 包含缺失值和数值字符串的 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")

运行结果预期:

=== 原始类型: 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 常用函数 Pandas 常用函数