【问题标题】:Convert multiple columns of a pandas data frame to dummy variables - Python将熊猫数据框的多列转换为虚拟变量 - Python
【发布时间】:2014-11-23 09:18:01
【问题描述】:

我有这个数据框:

据我所知,要将 Python 中的 scikit learn 包用于机器学习任务,应将分类变量转换为虚拟变量。因此,例如,使用 scikit learn 库我尝试将第三列的值转换为虚拟值,但我的代码不起作用:

from sklearn.preprocessing import LabelEncoder

x[:, 2] = LabelEncoder().fit_transform(x[:,2])

那么我的代码有什么问题?以及如何将所有分类变量转换为数据框中的虚拟变量?

编辑:完整的追溯是这样的:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-73-c0d726db979e> in <module>()
      1 from sklearn.preprocessing import LabelEncoder
      2 
----> 3 x[:, 2] = LabelEncoder().fit_transform(x[:,2])

C:\Users\toshiba\Anaconda\lib\site-packages\pandas\core\frame.pyc in __getitem__(self, key)
   2001             # get column
   2002             if self.columns.is_unique:
-> 2003                 return self._get_item_cache(key)
   2004 
   2005             # duplicate columns

C:\Users\toshiba\Anaconda\lib\site-packages\pandas\core\generic.pyc in _get_item_cache(self, item)
    665             return cache[item]
    666         except Exception:
--> 667             values = self._data.get(item)
    668             res = self._box_item_values(item, values)
    669             cache[item] = res

C:\Users\toshiba\Anaconda\lib\site-packages\pandas\core\internals.pyc in get(self, item)
   1653     def get(self, item):
   1654         if self.items.is_unique:
-> 1655             _, block = self._find_block(item)
   1656             return block.get(item)
   1657         else:

C:\Users\toshiba\Anaconda\lib\site-packages\pandas\core\internals.pyc in _find_block(self, item)
   1933 
   1934     def _find_block(self, item):
-> 1935         self._check_have(item)
   1936         for i, block in enumerate(self.blocks):
   1937             if item in block:

C:\Users\toshiba\Anaconda\lib\site-packages\pandas\core\internals.pyc in _check_have(self, item)
   1939 
   1940     def _check_have(self, item):
-> 1941         if item not in self.items:
   1942             raise KeyError('no item named %s' % com.pprint_thing(item))
   1943 

C:\Users\toshiba\Anaconda\lib\site-packages\pandas\core\index.pyc in __contains__(self, key)
    317 
    318     def __contains__(self, key):
--> 319         hash(key)
    320         # work around some kind of odd cython bug
    321         try:

TypeError: unhashable type

【问题讨论】:

  • 您应该提供完整的回溯,而不是仅仅说“它不起作用”。我怀疑问题在于制作虚拟变量会导致多列(原始列中的每个不同值都有一个),因此您不能分配回原始列。您可能想要创建一个包含虚拟列的新 DataFrame。
  • 在熊猫问题中,如果您包含 DataFrame 的可复制粘贴版本,通常会更好。我通常更喜欢df.to_dict的输出

标签: python pandas machine-learning scikit-learn


【解决方案1】:

我认为LabelEncoder 函数不会将您的数据转换为虚拟变量(请参阅scikit-learn.org/LabelEncoder),而是为变量创建新的数字标签。

我使用 pandas 的 get_dummies 函数来执行此操作(请参阅 pandas.pydata.org/dummies)。下面是一个简单的例子。

使用分类和数字数据创建一个简单的DataFrame

import pandas as pd
X = pd.DataFrame({"Var1": ["a", "a", "b"],
                  "Var2": ["a", "b", "c"],
                  "Var3": [1, 2, 3]},
                  dtype = "category")
X["Var3"] = X["Var3"].astype(int)

将数据转换为虚拟变量

pd.get_dummies(X)

输出[4]:

   Var3  Var1_a  Var1_b  Var2_a  Var2_b  Var2_c
0     1       1       0       1       0       0
1     2       1       0       0       1       0
2     3       0       1       0       0       1

请注意,Var1 已转换为两个虚拟变量,但您可能希望拥有所有三个类别 [a, b, c]。您需要添加新类别。

X["Var1"].cat.add_categories("c", inplace=True)

结果:

pd.get_dummies(X)

输出[6]:

   Var3  Var1_a  Var1_b  Var1_c  Var2_a  Var2_b  Var2_c
0     1       1       0       0       1       0       0
1     2       1       0       0       0       1       0
2     3       0       1       0       0       0       1

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2020-09-10
    • 2019-10-12
    • 2023-03-22
    相关资源
    最近更新 更多