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

Pandas pd.get_dummies() 函数

Pandas 通用函数 Pandas 常用函数


pd.get_dummies() 是 Pandas 库中用于分类变量独热编码(One-Hot Encoding)的函数。它将分类变量转换为二进制(0/1)列的形式,每个类别对应一列。

独热编码是机器学习预处理中的常用技术,因为大多数算法无法直接处理分类数据,需要将其转换为数值形式。

单词释义get_dummies 中 "dummy" 在这里是"虚拟变量"的意思,指的是统计学和计量经济学中用于表示分类变量的二进制变量。


基本语法与参数

pd.get_dummies() 是 Pandas 库的顶级函数,用于将分类变量转换为独热编码格式。

语法格式

pd.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, drop_first=False, dtype=None)

参数说明

  • 参数data
    • 类型: Series、DataFrame 或类数组对象。
    • 描述: 要进行独热编码的数据。通常是包含分类变量的 Series 或 DataFrame。
  • 参数prefix
    • 类型: 字符串、字符串列表或字典。
    • 描述> 生成的新列名的前缀。如果不指定,则使用原始列名作为前缀。
  • 参数prefix_sep
    • 类型: 字符串。
    • 描述: 前缀和类别名之间的分隔符。默认为下划线 '_'
  • 参数dummy_na
    • 类型> 布尔值。
    • 描述> 如果为 True,为缺失值(NaN)也创建一个单独的列。默认为 False
  • 参数columns
    • 类型: 列表或 None。
    • 描述: 要编码的列名。如果不指定,则对所有 object、category 或 boolean 类型的列进行编码。
  • 参数drop_first
    • 类型: 布尔值。
    • 描述> 如果为 True,会删除每个分类变量的第一列,以避免多重共线性。在逻辑回归等模型中可以避免虚拟变量陷阱。默认为 False

函数说明

  • 返回值: 返回一个 DataFrame,每列对应一个类别,值为 0 或 1。
  • 效果: 将分类变量转换为数值型的二进制列,便于机器学习算法处理。

实例

让我们通过一系列从简单到复杂的例子,彻底掌握 pd.get_dummies() 的用法。

示例 1:基础用法 - 对 Series 进行独热编码

实例

import pandas as pd

# 1. 创建一个包含分类变量的 Series
colors = pd.Series(['red', 'blue', 'green', 'red', 'green', 'blue'])

print("=== 原始 Series ===")
print(colors)

# 2. 使用 pd.get_dummies() 进行独热编码
result = pd.get_dummies(colors)
print("\n=== pd.get_dummies() 独热编码结果 ===")
print(result)

运行结果预期:

=== 原始 Series ===
0      red
1     blue
2     green
3      red
4     green
5     blue
dtype: object

=== pd.get_dummies() 独热编码结果 ===
    blue  green  red
0  False   False  True
1   True   False  False
2  False    True  False
3  False   False  True
4  False    True  False
5   True   False  False

代码解析:

  1. 原始 Series 包含三种颜色:red、blue、green。
  2. 独热编码后,每种颜色变成一列,用 True/False 表示该行是否属于该类别。
  3. 每行有且只有一个 True,对应原始的颜色值。

示例 2:对 DataFrame 的指定列进行编码

在数据分析中,通常只需要对特定的分类列进行编码,保留数值列不变。

实例

import pandas as pd

# 1. 创建包含数值和分类变量的 DataFrame
df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'Diana'],
    'age': [25, 30, 35, 28],
    'city': ['Beijing', 'Shanghai', 'Beijing', 'Guangzhou'],
    'department': ['Sales', 'Engineering', 'Sales', 'HR']
})

print("=== 原始 DataFrame ===")
print(df)

# 2. 对指定的分类列进行独热编码
result = pd.get_dummies(df, columns=['city', 'department'])
print("\n=== 对 city 和 department 列进行独热编码 ===")
print(result)

运行结果预期:

=== 原始 DataFrame ===
      name  age       city  department
0    Alice   25    Beijing       Sales
1      Bob   30  Shanghai  Engineering
2  Charlie   35    Beijing       Sales
3   Diana   28  Guangzhou         HR

=== 对 city 和 department 列进行独热编码 ===
      name  age  city_Beijing  city_Guangzhou  city_Shanghai  department_Engineering  department_HR  department_Sales
0    Alice   25           True            False           False                False            True
1      Bob   30          False           False            True                True           False
2  Charlie   35           True           False           False                False            True
3   Diana   28          False            True           False                False           False

代码解析:

  • 使用 columns 参数指定只对 citydepartment 列进行编码。
  • 数值列 age 和文本列 name 保持不变。
  • 新生成的列名使用默认的分隔符下划线,如 city_Beijing

示例 3:自定义前缀和分隔符

可以使用 prefixprefix_sep 参数自定义新列的名称。

< h2 class="example">实例
import pandas as pd

# 1. 创建 DataFrame
df = pd.DataFrame({
    'color': ['red', 'blue', 'green', 'red'],
    'size': ['S', 'M', 'L', 'XL']
})

print("=== 原始 DataFrame ===")
print(df)

# 2. 使用 prefix 参数自定义前缀
result_prefix = pd.get_dummies(df, prefix=['color', 'size'])
print("\n=== 使用自定义前缀 ===")
print(result_prefix)

# 3. 使用 prefix_sep 自定义分隔符
result_sep = pd.get_dummies(df, prefix=['color', 'size'], prefix_sep='-')
print("\n=== 使用自定义分隔符 '-' ===")
print(result_sep)

运行结果预期:

=== 原始 DataFrame ===
   color  size
0    red     S
1   blue     M
2  green     L
3    red    XL

=== 使用自定义前缀 ===
   color_blue  color_green  color_red  size_L  size_M  size_S  size_XL
0       False        False       True   False   False    True   False
1        True       False      False   False    True   False   False
2       False        True      False    True   False   False   False
3       False        False       True   False   False   False    True

=== 使用自定义分隔符 '-' ===
   color-blue  color-green  color-red  size-L  ...

代码解析:

  • prefix=['color', 'size'] 为不同列指定不同的前缀。
  • prefix_sep='-' 将默认的下划线改为短横线,新列名变为 color-red 这种形式。

示例 4:处理缺失值和 drop_first 参数

实例

import pandas as pd
import numpy as np

# 1. 包含缺失值的数据
df = pd.DataFrame({
    'color': ['red', 'blue', np.nan, 'red', 'green'],
    'size': ['S', 'M', 'L', np.nan, 'XL']
})

print("=== 包含缺失值的 DataFrame ===")
print(df)

# 2. 默认不处理缺失值
result_default = pd.get_dummies(df, columns=['color'])
print("\n=== 默认不处理缺失值 ===")
print(result_default)

# 3. dummy_na=True 为缺失值创建单独的列
result_na = pd.get_dummies(df, columns=['color'], dummy_na=True)
print("\n=== dummy_na=True 为缺失值创建列 ===")
print(result_na)

# 4. drop_first=True 删除第一列避免多重共线性
result_drop = pd.get_dummies(df, columns=['size'], drop_first=True)
print("\n=== drop_first=True 删除第一列 ===")
print(result_drop)

运行结果预期:

=== 包含缺失值的 DataFrame ===
   color  size
0    red     S
1   blue     M
2    NaN     L
3    red   NaN
4  green   XL

=== 默认不处理缺失值 ===
   size  color_blue  color_green  color_red
0     S       False        False       True
1     M        True       False      False
2     L       False        False      False
3     S       False        False       True
4    XL       False        True      False

=== dummy_na=True 为缺失值创建列 ===
   size  color_True  color_blue  color_green  color_red
0     S       False        False        False       True
1     M       False         True        False      False
2     L        True        False        False       False
3     S       False        False        False       True
4    XL       False        False         True       False

=== drop_first=True 删除第一列 ===
   color_blue  color_green  color_red
0       False        False       True
1        True       False      False
2       False        False      False
3       False        False       True
4       False        True       False


代码解析:

  • dummy_na=True 为缺失值创建一个额外的列(本例中显示为 color_True 列)。
  • drop_first=True 删除每组的第一列(如 size_M 被删除),可以避免线性模型中的多重共线性问题。

提示: 独热编码会增加数据维度(每个类别一列),如果类别数量非常大,可能会导致维度灾难。在这种情况下,可以考虑使用标签编码(pd.factorize())或其他编码方法。

Pandas 常用函数 Pandas 常用函数