我有一组数据帧,其中一列包含一个分类变量。我想把它转换成几个虚拟变量,在这种情况下,我通常使用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
试试这个:
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
使用转置和重新索引
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
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,如果尝试使用DataFrame
的sparse=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 都有虚拟线程了,那多线程在加虚拟线程并行岂不无敌