参考pandas官网
pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False, dtype=None)
参数:
data:array-like, Series, or DataFrame
prefix:str, list of str, or dict of str, default None.String to append DataFrame column names.
prefix_sep:str, default ‘_‘.If appending prefix, separator/delimiter to use.
dummy_na:bool, default False.Add a column to indicate NaNs, if False NaNs are ignored.
columns:list-like, default None.Column names in the DataFrame to be encoded.
sparse:bool, default False.Whether the dummy-encoded columns should be backed by a SparseArray (True) or a regular NumPy array (False).
drop_first:bool, default False.Whether to get k-1 dummies
dtype:dtype, default np.uint8.Data type for new columns.
例子:
>>>df = pd.DataFrame({'A': ['a', 'b', 'a'], 'B': ['b', 'a', 'c'],'C': [1, 2, 3]})
>>>pd.get_dummies(df, prefix=['col1', 'col2'])
C col1_a col1_b col2_a col2_b col2_c
0 1 1 0 0 1 0
1 2 0 1 1 0 0
2 3 1 0 0 0 1
>>>pd.get_dummies(df, prefix={"B": "from_B", "A": "from_A"})
C from_A_a from_A_b from_B_b from_B_c
0 1 1 0 0 1
1 2 0 1 0 1
2 3 1 0 1 0
>>>df = pd.DataFrame({"A": list("aaaaa"), "B": list("ababc")})
>>>pd.get_dummies(df, drop_first=True)
B_b B_c
0 0 0
1 1 0
2 0 0
3 1 0
4 0 1
与cut()连用:
>>>values = np.random.randn(10)
>>>values
array([ 0.4082, -1.0481, -0.0257, -0.9884, 0.0941, 1.2627, 1.29 ,
0.0824, -0.0558, 0.5366])
>>>bins = [0, 0.2, 0.4, 0.6, 0.8, 1]
>>>pd.get_dummies(pd.cut(values, bins))
(0.0, 0.2] (0.2, 0.4] (0.4, 0.6] (0.6, 0.8] (0.8, 1.0]
0 0 0 1 0 0
1 0 0 0 0 0
2 0 0 0 0 0
3 0 0 0 0 0
4 1 0 0 0 0
5 0 0 0 0 0
6 0 0 0 0 0
7 1 0 0 0 0
8 0 0 0 0 0
9 0 0 1 0 0
合并到原始数据
df = df.join(pd.get_dummies(df.A)) df.drop([A],axis=1,inplace=True)几点疑惑及验证
实验中需要分别对训练集和测试集进行One-hot编码,要求两个数据集编码后变量和数据含义一致,实际操作中遇到一些问题:
- 如果遇到某个变量的某个取值只在训练集中出现而未在测试集中出现,one-hot后的变量数不一致,怎么办?
答:检测出不一致的列,在缺少这些列的数据集中加入取值全为0的同名列。
for col in list(test.columns.difference(train.columns)):#train没有的列
df_obj = pd.DataFrame({col:np.squeeze(np.zeros((1,train.shape[0])))})
train = pd.concat([train,df_obj], axis = 1)
for col in list(train.columns.difference(test.columns)):#test没有的列
df_obj = pd.DataFrame({col:np.squeeze(np.zeros((1,test.shape[0])))})
test = pd.concat([test,df_obj], axis = 1)
2. 对于取值只有两类的变量,训练集中的1与测试集中的1代表相同类别吗?(如果变量取值类别大于2,one-hot时会生成带后缀的变量,不存在此问题)
答:是一样的。



