如何在Python中使用Pandas Get Dummies

1,145 阅读16分钟

在本教程中,我将向你展示如何使用 Pandas get dummies 函数在 Python 中创建虚拟变量。

我将解释这个函数的作用,解释pd.get_dummies的语法,并向你展示一步步的例子。

如果你需要特定的东西,只需点击以下任何一个链接。

目录

好的。 在我们看语法和例子之前,让我们先看一下函数的快速概述。

Pandas get dummies的快速介绍

Pandas getdummies函数在Python中从Pandas对象中创建假变量。

为了理解这一点,让我们快速回顾一下 "假人编码 "的基础知识。

虚拟变量是对分类信息的编码

那么究竟什么是虚拟变量呢?

虚拟变量是一个编码分类信息的数字变量。

虚拟变量有两个可能的值。0或1。

在一个虚拟变量中:

  • 1表示有一个类别的存在
  • 0表示没有一个类别。

An image that shows how dummy variables encode categorical information as 0/1 numeric variables.

我们经常称这些0/1变量为 "虚拟 "变量,但它们有时也被称为指标变量。 在机器学习中,这有时也被称为分类数据的 "一击 "编码。

Pandas Get Dummies从分类数据中创建虚拟变量

现在你明白了什么是虚拟变量,让我们来谈谈潘达斯的get_dummies函数。

正如你可能猜到的,pd.get_dummies创建了虚拟变量。

An image that shows how Pandas get dummies converts a categorical variable to binary dummy variables.

重要的是,pd.get_dummies可以从Pandas系列中创建虚拟变量,或者从Pandas数据框架中的一列或多列中创建虚拟变量。

我们将在例子部分看一下这两种情况。

虚拟变量对机器学习很重要

在我们看pd.get_dummies的语法之前,我想先说说为什么我们需要虚拟变量。

一些数据科学工具只有在输入数据为数字时才能工作。 这在机器学习中尤其如此。 许多机器学习算法--如线性回归和逻辑回归--严格要求输入数据为数字。 如果你试图用基于字符串的分类数据来使用它们,它们会抛出一个错误。

因此,在你使用这些工具之前,你需要将你的分类数据编码为数字虚拟变量。

说实话,这是经常让数据科学家和机器学习工程师感到沮丧的数据清理步骤之一。

但好消息是,Pandas的get dummies函数使其相对容易做到。

让我们来看看这个函数。

Pandas get dummies的语法

在这里,我们将看一下Pandasget_dummies() 函数的语法。

快速提醒

在我们看语法之前,我想提醒你,这个语法解释假设你已经导入了Pandas。

你可以像这样导入Pandas

import pandas as pd

它还假设你有一个可以使用的Pandas系列或数据框架。

(我们将在例子部分实际创建一个数据框架和一个系列。)

pd.get_dummies的语法

Pandas get dummies的语法非常简单。

你以pd.get_dummies() 的方式调用该函数。

在括号内,第一个参数是你要操作的对象。 这将是一个潘达斯数据框架或潘达斯系列。

An image that shows the syntax of pd.get_dummies.

还有一些可选的参数,你可以用它们来改变函数的工作方式。

让我们仔细看看它们。

pd.get_dummies的参数

Pandas get dummies函数有

  • data_object
  • columns
  • prefix
  • prefix_sep
  • drop_first
  • dummy_na
  • sparse
  • dtype

让我们来看看这些。

dtype (必填)

data_object "参数使你能够指定一个你想操作的数据对象。

这可以是一个Pandas数据框,一个Pandas系列,或者一个类似列表的对象(即一个列表等)。

重要的是,你只能通过位置来使用这个参数。 Pandas假定你传递给函数的第一个参数应该对应于这个参数。

columns

columns 参数指定了你要转换为虚拟变量的列。

这一列只在你对有多列的数据框架进行操作时适用。

prefix

prefix 参数使你可以为新的虚拟变量的名称指定前缀。

默认情况下,前缀是你要转换的变量的名称。

因此,如果你对一个名为 "sex"的变量进行操作,新的虚拟变量将以前缀 "sex"开始。

你会在示例部分看到这样的例子。

prefix_sep

prefix_sep 参数使你可以在虚拟变量的名称中指定前缀和虚拟类别之间的分隔符。

默认情况下,分隔符为"_"。

因此,如果你对一个名为sex 的虚拟变量进行编码,其类别为malefemale ,那么默认情况下,输出的虚拟变量将被命名为sex_malesex_female 。(注意这些变量名称中的下划线字符)。

drop_first

drop_first 参数指定你是否要放弃你要编码的分类变量的第一个类别。

默认情况下,这个参数被设置为drop_first = False 。这将导致get_dummies为输入分类变量的每一级创建一个虚拟变量。

如果你设置了drop_first = True ,那么它将放弃第一个类别。 因此,如果你有K个类别,它将只产生K-1个虚拟变量。

dummy_na

dummy_na 参数可以让你指定get_dummies是否会创建一个单独的虚拟变量来编码缺失值。

默认情况下,这个参数被设置为dummy_na = False 。在这种情况下,get_dummies不会为NA值创建一个虚拟变量。

如果dummy_na = True ,get_dummies将创建一个单独的变量,如果输入值是缺失的,则包含1,否则为0。

如果你的数据有缺失值,而你认为缺失值在某种程度上是有参考价值的,那么这就很有用。

sparse

sparse 参数指定了新的虚拟变量是否由SparceArray 支持。

(这一点很少使用)。

dtype

dtype参数指定了新虚拟变量的数据类型。

默认情况下,新虚拟变量的数据类型是np.uint8

pd.get_dummies的输出

作为输出,Pandas get dummies函数将返回一个包含新虚拟变量的数据框架。

示例。如何使用Pandas在Python中创建虚拟变量

现在你已经看过了Pandas get dummies函数的语法,让我们来看看如何在Python中创建虚拟变量的一些例子。

例子:

首先运行此代码

在你运行这些例子之前,你需要运行一些初步的代码来。

  • 导入必要的包
  • 获取示例数据框架

让我们分别进行这些工作。

导入软件包

首先,让我们导入Pandas和Numpy。

import pandas as pd
import numpy as np

很明显,我们需要Pandas来使用pd.get_dummies函数。

但是当我们创建数据时,我们将使用Numpy,以便包括NA值。

创建示例数据框架

接下来,我们需要创建一个我们可以使用的数据集。

在这里,我们将使用pd.DataFrame函数创建一些模拟的 "销售数据",其中有一个将成为列的值的字典。

sales_data = pd.DataFrame({"name":["William","Emma","Sofia","Markus","Edward","Thomas","Ethan","Olivia","Arun","Anika","Paulo"]
                           ,"sales":[50000,52000,90000,34000,42000,72000,49000,55000,67000,65000,67000]
                           ,"region":["East","North","East","South","West","West","South","West","West","East",np.nan]
                           }
                          )

让我们打印出数据来看看内容。

print(sales_data)

输出

       name  sales region
0   William  50000   East
1      Emma  52000  North
2     Sofia  90000   East
3    Markus  34000  South
4    Edward  42000   West
5    Thomas  72000   West
6     Ethan  49000  South
7    Olivia  55000   West
8      Arun  67000   West
9     Anika  65000   East
10    Paulo  67000    NaN

region 变量是一个分类变量,我们将能够把它转化为0/1的虚拟变量。

另外,注意到region 的其中一个值是np.nan (即缺失值)。 这在例子5中是很重要的。

创建系列

我们还将创建一个名为region 的潘达斯系列。

region = sales_data.region

这个变量包含了我们在数据框架中创建的区域类别。

现在我们有了一些数据,让我们来看看一些例子。

例子1:在一个系列上使用Getdummies

首先,让我们在一个潘达斯系列上使用get dummies函数。

我们将在我们之前创建的region 系列上使用这个函数。

打印数据

首先,让我们打印出数据,这样我们就可以看到系列中的内容。

print(region)

输出

0      East
1     North
2      East
3     South
4      West
5      West
6     South
7      West
8      West
9      East
10      NaN
Name: region, dtype: object

正如你所看到的,region 包含的字符串数据被组织成4个类别(北、南、东和西)。 在该系列的末尾还有一个缺失值。

使用pd.get_dummies

现在,我们将使用Pandas的get_dummies函数。

pd.get_dummies(region)

输出

    East  North  South  West
0      1      0      0     0
1      0      1      0     0
2      1      0      0     0
3      0      0      1     0
4      0      0      0     1
5      0      0      0     1
6      0      0      1     0
7      0      0      0     1
8      0      0      0     1
9      1      0      0     0
10     0      0      0     0

(注意:这个输出实际上是一个数据帧。)

解释

注意这里发生了什么。

pd.get_dummies的输出是一组4个新变量

  • East
  • North
  • South
  • West

原始分类变量的每一级都有一个新变量。

在原始系列中值为'East'的地方,新的East 变量的值为1(而其他变量的值为0)。

如果在原系列中的值是'North',新的North 变量的值是1(而其他变量的值是0)。

以此类推。

所以get_dummies函数将一个有4个值的单一变量重新编码为4个有0或1值的变量。 新的结构有效地包含了相同的信息,但它以不同的方式表示。

实例2:在数据框架列上使用Getdummies

接下来,我们将在数据框架内的一个列上使用pd.get_dummies。

具体来说,我们将在sales_data 数据框架内的region 变量上使用Pandas get_dummies。

pd.get_dummies(sales_data, columns = ['region'])

输出

       name  sales  region_East  region_North  region_South  region_West
0   William  50000            1             0             0            0
1      Emma  52000            0             1             0            0
2     Sofia  90000            1             0             0            0
3    Markus  34000            0             0             1            0
4    Edward  42000            0             0             0            1
5    Thomas  72000            0             0             0            1
6     Ethan  49000            0             0             1            0
7    Olivia  55000            0             0             0            1
8      Arun  67000            0             0             0            1
9     Anika  65000            1             0             0            0
10    Paulo  67000            0             0             0            0

解释

首先,请注意,操作的输出是一个新的数据框架。

在这个新的数据框架中,旧的region 变量已经消失。

它已经被4个新的变量所取代。

  • region_East
  • region_North
  • region_South
  • region_West

默认情况下,get_dummies使用旧变量的名称(region )作为新变量名称的前缀。

也注意到新的变量是如何编码的。

  • 在原始系列中值为'East'的地方,新的region_East 变量的值为1(而其他变量的值为0)
  • 如果原系列中的值是'North',新的region_North 变量的值为1(其他变量的值为0)。
  • 如果原系列中的值为'South',则新的region_South 变量的值为1(其他变量的值为0)。
  • 在原系列中值为'West'的地方,新的region_West 变量的值为1(其他变量的值为0)。

所以Pandas get_dummies为原始分类变量的每一级都创建了一个新的0/1变量。

这与例子1非常相似,但我们不是在一个独立的Pandas系列上执行这个操作,而是在一个存在于数据框架内的列上执行这个操作。

(注意,这个操作的输出是一个新的数据框架)。

实例3:在数据框架列上使用Getdummies,并删除第一个类别

现在,我们将使用get_dummies,但我们将使用drop_first 参数来删除我们所操作的分类变量的第一层。

为了做到这一点,我们将设置drop_first = True

pd.get_dummies(sales_data
               ,columns = ['region']
               ,drop_first = True
               )

输出

       name  sales  region_North  region_South  region_West
0   William  50000             0             0            0
1      Emma  52000             1             0            0
2     Sofia  90000             0             0            0
3    Markus  34000             0             1            0
4    Edward  42000             0             0            1
5    Thomas  72000             0             0            1
6     Ethan  49000             0             1            0
7    Olivia  55000             0             0            1
8      Arun  67000             0             0            1
9     Anika  65000             0             0            0
10    Paulo  67000             0             0            0

解释

注意,现在的输出只有3个虚拟变量。

  • region_North
  • region_South
  • 西部地区

East"类别的虚拟变量已经消失。

为什么?

设置drop_first = True ,使get_dummies排除你所操作的变量的第一个类别的虚拟变量。

但是我们为什么要这样做呢?

当你有一个具有K个互斥类别的分类变量时,你实际上只需要K-1个新的虚拟变量来编码相同的信息。

这是因为如果所有现有的虚拟变量都等于0,那么我们知道剩下的虚拟变量的值应该是1。

因此,例如,如果region_North == 0 ,和region_South == 0 ,和region_West == 0 ,那么region_East 必须等于1。 这是由现有的3个虚拟变量所暗示的,所以我们不需要第4个。 额外的虚拟变量实际上包含了多余的信息。

所以,对于你要编码的分类变量的第一层,放弃虚拟变量是一个常见的惯例。

(事实上,在某些类型的机器学习模型中经常需要这样做。 如果你没有放弃额外的虚拟变量,它可能会导致你的模型出现问题)。

例子4:在数据框架列上使用Getdummies,并为虚拟变量指定一个前缀

现在,我们将用一个特定的前缀来创建虚拟变量。

记住:在默认情况下,它使用变量名称作为新的虚拟变量的前缀。

但是在这里,我们将设置prefix = 'sales_region' ,使用不同的前缀。

pd.get_dummies(sales_data
               ,columns = ['region']
               ,prefix = 'sales_region'
               )

输出

       name  sales  sales_region_East  sales_region_North  sales_region_South   sales_region_West
0   William  50000                  1                   0                   0                   0    
1      Emma  52000                  0                   1                   0                   0   
2     Sofia  90000                  1                   0                   0                   0  
3    Markus  34000                  0                   0                   1                   0  
4    Edward  42000                  0                   0                   0                   1
5    Thomas  72000                  0                   0                   0                   1    
6     Ethan  49000                  0                   0                   1                   0 
7    Olivia  55000                  0                   0                   0                   1  
8      Arun  67000                  0                   0                   0                   1
9     Anika  65000                  1                   0                   0                   0
10    Paulo  67000                  0                   0                   0                   0 

解释

请注意,现在,所有虚拟变量的前缀都是sales_region (而不是只有region )。

这是因为我们用prefix 参数手动设置了前缀。

请记住,前缀可以更复杂:你可以提供一个前缀值的字典,与新的虚拟变量相对应。 但是,98%的情况下,你只想设置一个前缀,就像我们在这里做的那样。

例子5:在数据框架列上使用Getdummies,并包括NA值

最后,让我们看看如何为缺失值创建一个虚拟变量。

你会注意到,在我们的数据框架sales_data ,其中一行的区域值是NaN (保罗的那一行)。 这是一个缺失值。

你还会注意到,在以前的例子中,对于这一行的数据,所有新创建的虚拟变量的值都是0。

在这里,我们将创建一个额外的虚拟变量,编码为1的缺失值。

为了做到这一点,我们将设置dummy_na = True

pd.get_dummies(sales_data
               ,columns = ['region']
               ,dummy_na = True
               )

输出

       name  sales  region_East  ...  region_South  region_West  region_nan
0   William  50000            1  ...             0            0           0
1      Emma  52000            0  ...             0            0           0
2     Sofia  90000            1  ...             0            0           0
3    Markus  34000            0  ...             1            0           0
4    Edward  42000            0  ...             0            1           0
5    Thomas  72000            0  ...             0            1           0
6     Ethan  49000            0  ...             1            0           0
7    Olivia  55000            0  ...             0            1           0
8      Arun  67000            0  ...             0            1           0
9     Anika  65000            1  ...             0            0           0
10    Paulo  67000            0  ...             0            0           1

解释

你可以看到,在输出中,除了为每个类别创建虚拟变量外,get_dummies还创建了一个名为region_nan 的变量。

这个值只有在我们操作的变量的值有缺失的情况下才有1 (NaN)。 对于所有其他的值,region_nan 的值为0。

当你有缺失值的数据,而你想在新的虚拟变量中对缺失值的信息进行编码时,这一点很有用。

有时,这很有用。 在机器学习中,我们有时称之为 "信息性缺失"。

关于Pandas Getdummies的常见问题

现在我们已经看了一些例子,让我们看看关于get_dummies() 技术的一些常见问题。

常见问题。

问题1:我使用了get_dummies,但是我的数据没有变化。 为什么?

如果你使用get_dummies函数,你可能会注意到,在你调用该函数后,你的原始数据仍然没有变化。

例如,在例子1中,我们使用了以下代码。

pd.get_dummies(sales_data, columns = ['region'])

但是如果你在运行该代码后检查sales_data ,你会发现它仍然包含原始变量(而虚拟变量在那里。

这是因为当我们运行get_dummies() 函数时,它会输出一个新的对象,而让原来的对象保持不变。

这就是大多数Pandas方法的工作方式。

默认情况下,输出被发送到控制台。 我们可以在控制台中看到输出,但是为了保存它,我们需要用一个名字来存储它。

例如,你可以像这样存储输出。

sales_data_updated = pd.get_dummies(sales_data, columns = ['region'])

你可以把新的输出命名为任何你想要的东西。 你甚至可以用原来的名字命名sales_data

但是要小心。如果你把get_dummies 的输出重新指定为数据集的名称,它将覆盖你的原始数据集。 请确保在你这样做之前检查你的代码,使其正常工作。

本教程向你展示了如何使用Pandas的get_dummies方法,但如果你想掌握Pandas的数据处理,还有很多东西需要学习。