Pandas pd.get_dummies() 函数
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)
# 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
代码解析:
- 原始 Series 包含三种颜色:red、blue、green。
- 独热编码后,每种颜色变成一列,用
True/False表示该行是否属于该类别。 - 每行有且只有一个
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)
# 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参数指定只对city和department列进行编码。 - 数值列
age和文本列name保持不变。 - 新生成的列名使用默认的分隔符下划线,如
city_Beijing。
示例 3:自定义前缀和分隔符
可以使用 prefix 和 prefix_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)
# 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)
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 常用函数