当前位置: 首页 > 知识库问答 >
问题:

当不是所有类别都存在时,虚拟变量

凌联
2023-03-14

我有一组数据帧,其中一列包含一个分类变量。我想把它转换成几个虚拟变量,在这种情况下,我通常使用get\u dummies

发生的事情是,get_dummies查看每个数据帧中可用的数据,找出有多少类别,从而创建适当数量的虚拟变量。然而,在我现在研究的问题中,我实际上提前知道了可能的类别。但当单独查看每个数据帧时,并不一定会出现所有类别。

我的问题是:有没有一种方法可以传递给get_dummies(或等效函数)类别的名称,以便对于给定数据帧中没有出现的类别,它只创建一列0?

这就是:

categories = ['a', 'b', 'c']

   cat
1   a
2   b
3   a

变成这样:

  cat_a  cat_b  cat_c
1   1      0      0
2   0      1      0
3   1      0      0

共有3个答案

石苏燕
2023-03-14

试试这个:

In[1]: import pandas as pd
       cats = ["a", "b", "c"]

In[2]: df = pd.DataFrame({"cat": ["a", "b", "a"]})

In[3]: pd.concat((pd.get_dummies(df.cat, columns=cats), pd.DataFrame(columns=cats))).fillna(0)
Out[3]: 
     a    b    c
0  1.0  0.0  0
1  0.0  1.0  0
2  1.0  0.0  0
羊舌承颜
2023-03-14

使用转置和重新索引

import pandas as pd

cats = ['a', 'b', 'c']
df = pd.DataFrame({'cat': ['a', 'b', 'a']})

dummies = pd.get_dummies(df, prefix='', prefix_sep='')
dummies = dummies.T.reindex(cats).T.fillna(0)

print dummies

    a    b    c
0  1.0  0.0  0.0
1  0.0  1.0  0.0
2  1.0  0.0  0.0
干旺
2023-03-14

TL;博士:

pd.get_dummies(cat.astype(pd.CategoricalDtype(categories=categories)))
  • 老熊猫:pd。获取虚拟对象(cat.astype('category',categories=categories))

是否有一种方法可以传递以获取_dummies(或等效函数)类别的名称,以便对于未出现在给定数据帧中的类别,只创建一列0?

是的,有!熊猫有一种特殊类型的系列,仅用于分类数据。这个系列的属性之一是可能的类别,get_dummies考虑到这些类别。这里有一个例子:

In [1]: import pandas as pd

In [2]: possible_categories = list('abc')

In [3]: cat = pd.Series(list('aba'))

In [4]: cat = cat.astype(pd.CategoricalDtype(categories=possible_categories))

In [5]: cat
Out[5]: 
0    a
1    b
2    a
dtype: category
Categories (3, object): [a, b, c]

然后,get_dummies将完全按照您的意愿执行

In [6]: pd.get_dummies(cat)
Out[6]: 
   a  b  c
0  1  0  0
1  0  1  0
2  1  0  0

还有许多其他方法可以创建一个分类的系列数据帧,这正是我觉得最方便的方法。您可以在pandas文档中阅读所有这些内容。

编辑:

我没有遵循确切的版本,但是熊猫如何处理稀疏矩阵存在一个错误,至少在0.17.0版本之前是这样。版本0.18.1(2016年5月发布)对其进行了更正。

对于版本0.17。0,如果尝试使用DataFramesparse=True选项执行此操作,则缺少的伪变量的零列将是NaN列,并将其转换为稠密。

看起来像熊猫0.21。0添加了一个CategoricalDType,创建明确包含原始答案中的类别的类别被否决,我不太确定何时创建。

 类似资料:
  • 是否真的有必要使用或? 我知道在这个总的话题上有很多问题,例如: 派生类中函数的“virtual”关键字。有必要吗? < Li >“override”关键字是否只是对被重写的虚方法的检查? < li >虚拟?覆盖?还是两者都有?C 从这些和其他标记为重复项的内容中(许多“重复项”的答案都包含至少对我来说是新的不同信息),我学到了一些东西(我认为,大致为什么它们是真的):没有虚拟的覆盖不会编译。没有

  • 问题内容: 如果Java中没有编译时绑定,是否意味着所有绑定都在运行时完成? 但是,按照OOP的运行时绑定概念,函数必须具有virtual关键字。.是否所有方法在Java中都是隐式虚拟的,还是Java中存在任何编译时绑定? 如果有任何编译时约束,您能给我一些具体情况,还是链接到更多信息 静态的(这里没有绑定的含义,因为静态不属于对象) 最终的(这不是有效点,因为可以通过其他方式实现) 问题答案:

  • 问题内容: 如果我们为特定的设置,java如何为它设置时间,例如,如果我们将其设置为时区,它怎么知道确切的时区,它在哪里维护? 提前致谢 问题答案: 时区数据源是特定于实现的,但是我相信大多数实现都使用IANA数据库(即zoneinfo,aka tz,aka Olson,aka TZDB)。 请注意,PST实际上不是时区-它是时区的“一部分”。时区为“太平洋时间”,通常以ID标识。

  • 相对来说,我是java的业余爱好者,一直使用类和对象调用静态变量和方法。当它们是静态的时,类和对象都可以使用它们。 为什么程序员不对类变量和方法都保持默认的静态?

  • 有没有人知道如何修改下面的代码来处理这个问题?

  • java 都有虚拟线程了,那多线程在加虚拟线程并行岂不无敌