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=True
和dummy_na=False
意味着NaN
与第一个变量的实例无法区分,因此如果您的数据集可能包含任何 NaN
,则强烈建议不要这样做。值。
关于python - 从 pandas 中的虚拟变量重建分类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54761333/