python - 从 pandas 中的虚拟变量重建分类变量

标签 python pandas

pd.get_dummies 允许将分类变量转换为虚拟变量。除了重建分类变量很简单之外,是否有一种首选/快速的方法来做到这一点?

最佳答案

已经过去几年了,所以这很可能不在 pandas 中。最初问这个问题时的工具包,但这种方法对我来说似乎更容易一些。 idxmax将返回与最大元素对应的索引(即带有 1 的元素)。我们做axis=1因为我们想要 1 所在的列名发生。

编辑:我没有费心将其分类而只是一个字符串,但是您可以像 @Jeff 一样通过用 pd.Categorical 包装它来做到这一点。 (和 pd.Series ,如果需要的话)。

In [1]: import pandas as pd

In [2]: s = pd.Series(['a', 'b', 'a', 'c'])

In [3]: s
Out[3]: 
0    a
1    b
2    a
3    c
dtype: object

In [4]: dummies = pd.get_dummies(s)

In [5]: dummies
Out[5]: 
   a  b  c
0  1  0  0
1  0  1  0
2  1  0  0
3  0  0  1

In [6]: s2 = dummies.idxmax(axis=1)

In [7]: s2
Out[7]: 
0    a
1    b
2    a
3    c
dtype: object

In [8]: (s2 == s).all()
Out[8]: True

编辑回应@piRSquared的评论: 该解决方案确实假设有一个 1每行。我认为这通常是一种格式。 pd.get_dummies如果有 drop_first=True 则可以返回全为 0 的行或者如果有NaN值和dummy_na=False (默认)(我遗漏了什么情况?)。全零的行将被视为第一列中指定的变量的实例(例如上例中的 a)。

如果drop_first=True ,您无法仅从虚拟数据框中知道“第一个”变量的名称是什么,因此该操作是不可逆的,除非您保留额外的信息;我建议离开drop_first=False (默认)。

dummy_na=False是默认值,这肯定会导致问题。 请设置dummy_na=True当您调用pd.get_dummies时如果您想使用此解决方案来反转“虚拟化”并且您的数据包含任何 NaNs .设置dummy_na=True总是添加一个“nan”列,即使该列全是0,所以你可能不想设置它,除非你实际上有 NaN s。一个不错的方法可能是设置 dummies = pd.get_dummies(series, dummy_na=series.isnull().any()) 。同样好的一点是 idxmax解决方案将正确重新生成您的 NaN s(不仅仅是一个表示“nan”的字符串)。

还值得一提的是设置 drop_first=Truedummy_na=False意味着NaN与第一个变量的实例无法区分,因此如果您的数据集可能包含任何 NaN ,则强烈建议不要这样做。值。

关于python - 从 pandas 中的虚拟变量重建分类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54761333/

相关文章:

python - Pygettext - 获取多行文本

python - pandas *有效地*按组将有效值复制到其他行

python - 如果当前日期在列中则显示行

Python数据帧如何获取重复计数> 1的行

python - 如何使用 Django REST 序列化程序对保留键进行验证?

python - 在 Django 中上传视频并从视频创建缩略图

python - 对某些列进行 groupby 和 sum 与 pandas,同时还包括其他列

python - gdata认证麻烦python

python-3.x - 如何建立一个包含同一组中每个国家/地区的值(value)观的字典

python - 如何从字典列表转换为字典?