如何让 pandas get_dummies 发出 N-1 个变量以避免共线性?
how to get pandas get_dummies to emit N-1 variables to avoid collinearity?
pandas.get_dummies
为每个分类值发出一个虚拟变量。有没有一些自动化的、简单的方法让它只创建 N-1 个虚拟变量? (随便去掉一个"baseline"变量)?
需要避免数据集中的共线性。
有多种方法可以做到这一点。
可能最简单的方法是在调用 get_dummies
之前用 None
替换其中一个值。假设您有:
import pandas as pd
import numpy as np
s = pd.Series(list('babca'))
>> s
0 b
1 a
2 b
3 c
4 a
然后使用:
>> pd.get_dummies(np.where(s == s.unique()[0], None, s))
a c
0 0 0
1 1 0
2 0 0
3 0 1
4 1 0
放弃 b
。
(当然,你需要考虑你的类别列是否已经包含None
。)
另一种方法是使用 prefix
参数到 get_dummies
:
pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False)
prefix: string, list of strings, or dict of strings, default None - String to append DataFrame column names Pass a list with length equal to the number of columns when calling get_dummies on a DataFrame. Alternativly, prefix can be a dictionary mapping column names to prefixes.
这将为所有结果列附加一些前缀,然后您可以删除带有该前缀的列之一(只需使其唯一)。
Pandas 版本 0.18.0 实现了您正在寻找的东西:drop_first
选项。这是一个例子:
In [1]: import pandas as pd
In [2]: pd.__version__
Out[2]: u'0.18.1'
In [3]: s = pd.Series(list('abcbacb'))
In [4]: pd.get_dummies(s, drop_first=True)
Out[4]:
b c
0 0.0 0.0
1 1.0 0.0
2 0.0 1.0
3 1.0 0.0
4 0.0 0.0
5 0.0 1.0
6 1.0 0.0
pandas.get_dummies
为每个分类值发出一个虚拟变量。有没有一些自动化的、简单的方法让它只创建 N-1 个虚拟变量? (随便去掉一个"baseline"变量)?
需要避免数据集中的共线性。
有多种方法可以做到这一点。
可能最简单的方法是在调用 get_dummies
之前用 None
替换其中一个值。假设您有:
import pandas as pd
import numpy as np
s = pd.Series(list('babca'))
>> s
0 b
1 a
2 b
3 c
4 a
然后使用:
>> pd.get_dummies(np.where(s == s.unique()[0], None, s))
a c
0 0 0
1 1 0
2 0 0
3 0 1
4 1 0
放弃 b
。
(当然,你需要考虑你的类别列是否已经包含None
。)
另一种方法是使用 prefix
参数到 get_dummies
:
pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False)
prefix: string, list of strings, or dict of strings, default None - String to append DataFrame column names Pass a list with length equal to the number of columns when calling get_dummies on a DataFrame. Alternativly, prefix can be a dictionary mapping column names to prefixes.
这将为所有结果列附加一些前缀,然后您可以删除带有该前缀的列之一(只需使其唯一)。
Pandas 版本 0.18.0 实现了您正在寻找的东西:drop_first
选项。这是一个例子:
In [1]: import pandas as pd
In [2]: pd.__version__
Out[2]: u'0.18.1'
In [3]: s = pd.Series(list('abcbacb'))
In [4]: pd.get_dummies(s, drop_first=True)
Out[4]:
b c
0 0.0 0.0
1 1.0 0.0
2 0.0 1.0
3 1.0 0.0
4 0.0 0.0
5 0.0 1.0
6 1.0 0.0