当我们需要对分类变量进行建模时,经常需要将这些变量转换为虚拟变量(Dummy Variables)。在Python中,Pandas是处理数据的流行工具,提供了简单易用的API,允许用户轻松地创建虚拟变量。下面是使用Pandas创建虚拟变量的完整攻略:
准备数据
首先,我们需要准备包含分类变量的数据。
import pandas as pd
# 创建一个数据集
df = pd.DataFrame({
'color': ['red', 'blue', 'green', 'red', 'blue'],
'size': ['M', 'S', 'S', 'L', 'M'],
'price': [10, 20, 30, 40, 50]
})
# 显示数据集的内容
print(df)
输出:
color size price
0 red M 10
1 blue S 20
2 green S 30
3 red L 40
4 blue M 50
我们的数据集中包含两个分类变量:color
和size
。
创建虚拟变量
接下来,使用Pandas的get_dummies()
函数来创建虚拟变量。
# 创建虚拟变量
dummy_color = pd.get_dummies(df['color'], prefix='color')
dummy_size = pd.get_dummies(df['size'], prefix='size')
# 将虚拟变量添加到数据集中
df = pd.concat([df, dummy_color, dummy_size], axis=1)
# 显示添加虚拟变量后的数据集
print(df)
输出:
color size price color_blue color_green color_red size_L size_M size_S
0 red M 10 0 0 1 0 1 0
1 blue S 20 1 0 0 0 0 1
2 green S 30 0 1 0 0 0 1
3 red L 40 0 0 1 1 0 0
4 blue M 50 1 0 0 0 1 0
我们可以看到,get_dummies()
函数使用每个唯一的分类值来创建一个虚拟变量,并为每个分类值分配一个0或1。然后,我们使用concat()
函数将虚拟变量添加到原始数据集中。
示例
下面是两个示例,它们演示了如何在Python中使用Pandas创建虚拟变量:
示例一:使用TicTacToe数据集进行分类
import pandas as pd
import requests
# 使用TicTacToe数据集
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/tic-tac-toe/tic-tac-toe.data'
response = requests.get(url)
# 读取数据
df = pd.read_csv(
pd.compat.StringIO(response.text),
header=None,
names=['top-left', 'top-middle', 'top-right', 'middle-left', 'middle-middle', 'middle-right', 'bottom-left', 'bottom-middle', 'bottom-right', 'class']
)
# 创建虚拟变量
dummies = pd.get_dummies(df)
# 显示虚拟变量
print(dummies)
输出:
class_n class_o top-left_b top-left_o top-left_x top-middle_b top-middle_o top-middle_x top-right_b top-right_o top-right_x middle-left_b middle-left_o middle-left_x middle-middle_b middle-middle_o middle-middle_x middle-right_b middle-right_o middle-right_x bottom-left_b bottom-left_o bottom-left_x bottom-middle_b bottom-middle_o bottom-middle_x bottom-right_b bottom-right_o bottom-right_x
0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0
1 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 1 0 0
2 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 0 0 1
3 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 0 0 1
4 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0
.. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
953 0 1 1 0 0 0 0 1 0 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0
954 0 1 1 0 0 0 0 1 0 1 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 1 1 0 0
955 0 1 1 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0
956 0 1 1 0 0 0 0 1 0 1 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 1 1 0 0
957 0 1 1 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0 1 0 1 0
[958 rows x 28 columns]
示例二:使用MovieLens数据集进行分类
import pandas as pd
import requests
# 使用MovieLens数据集
url = 'https://raw.githubusercontent.com/wesm/pydata-book/2nd-edition/datasets/movielens/movies.dat'
response = requests.get(url)
# 读取数据
df = pd.read_csv(
pd.compat.StringIO(response.text),
sep='::',
header=None,
names=['movie_id', 'title', 'genres']
)
# 创建虚拟变量
dummies = df['genres'].str.get_dummies(sep='|')
# 合并虚拟变量和原始数据集
df = pd.concat([df, dummies], axis=1)
# 显示部分结果
print(df[['movie_id', 'title', 'Horror', 'Mystery', 'Thriller']].head())
输出:
movie_id title Horror Mystery Thriller
0 1 Toy Story (1995) 0 0 0
1 2 Jumanji (1995) 0 0 0
2 3 Grumpier Old Men (1995) 0 0 0
3 4 Waiting to Exhale (1995) 0 0 0
4 5 Father of the Bride Part II (1995) 0 0 0
我们可以看到,我们使用了get_dummies()
来创建虚拟变量,并使用str.get_dummies()
处理MovieLens数据集中的多个分类值。最后,我们将虚拟变量和原始数据集合并起来,并显示了部分结果。