python - k-hot 对来自多列的值进行编码
问题描述
我有pandas.DataFrame
:
| | col_1 | col_2 | col_3 | col_4 |
|:--|:------|:------|:------|:------|
| 0 | 1 | 2 | NaN | NaN |
| 1 | 3 | 4 | 5 | 6 |
| 2 | 2 | 6 | NaN | NaN |
我必须将值(1、2、3、4、5、6)转换为列,如果该值在行中,则为行设置 1,否则为 0:
| | 1 | 2 | 3 | 4 | 5 | 6 |
|:--|:--|:--|:--|:--|:--|:--|
| 0 | 1 | 1 | 0 | 0 | 0 | 0 |
| 1 | 0 | 0 | 1 | 1 | 1 | 1 |
| 2 | 0 | 1 | 0 | 0 | 0 | 1 |
pd.get_dummies
在这里不起作用。正如我所见pd.get_dummies
,one_hot 无法通过数据框列中的所有值进行编码
我怎样才能实现它?
解决方案
一种方法broadcasting
-
In [67]: df
Out[67]:
0 1 2 3
0 1.0 2.0 NaN NaN
1 3.0 4.0 5.0 6.0
2 2.0 6.0 NaN NaN
In [68]: constant_set = [1, 2, 3, 4, 5, 6]
In [69]: (df.values[:,:,None] == constant_set).any(1).astype(int)
Out[69]:
array([[1, 1, 0, 0, 0, 0],
[0, 0, 1, 1, 1, 1],
[0, 1, 0, 0, 0, 1]])
# Dataframe output
In [73]: out = (df.values[:,:,None] == constant_set).any(1).astype(int)
In [74]: pd.DataFrame(out, columns=constant_set)
Out[74]:
1 2 3 4 5 6
0 1 1 0 0 0 0
1 0 0 1 1 1 1
2 0 1 0 0 0 1
另一个考虑到内存效率 -
idx = np.searchsorted(constant_set, a)
out = np.zeros((len(df),len(constant_set)),dtype=int)
flattend_idx = idx + out.shape[1]*np.arange(len(idx))[:,None]
out.flat[flattend_idx[idx<len(constant_set)]] = 1
推荐阅读
- powershell - 管道流到其他进程
- slack-api - Slack API - 用户详细信息上次更新日期
- excel - 出现错误后取消隐藏隐藏 Excel 工作表并关闭用户窗体
- python - 为什么这个输出辐照度预测值会有些相同?我正在使用 PVLIB 的 GFS 模型。我在这里做错了什么?
- php - 从预先加载的 laravel 集合中加载特定的列
- acumatica - Acumatica:正确释放的正确方法是什么,以便首先发生基础
- rust - 如何使用标准库对单词进行排序?
- java - Eclipse 错误:java.lang.ClassNotFoundException:org.eclipse.e4.core.di_1.6.1.v20160712-0927 找不到 javax.annotation.PreDestroy
- php - 具有相同名称 Woocommerce 的多个属性
- c++ - 是否可以展开可变参数 (lambda) 模板并将这些函数的返回值传递给另一个可变参数函数?