如何用Pandas在Python中创建虚拟变量

  • Post category:Python

当我们需要对分类变量进行建模时,经常需要将这些变量转换为虚拟变量(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

我们的数据集中包含两个分类变量:colorsize

创建虚拟变量

接下来,使用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数据集中的多个分类值。最后,我们将虚拟变量和原始数据集合并起来,并显示了部分结果。