【发布时间】:2018-06-26 20:41:44
【问题描述】:
我有一个带有分类因子的模型。我使用 pandas.get_dummies 将其编码为 One Hot Encoding。
不过,分类因素有许多不常见的级别。如果我使用pandas.get_dummies 重新编码新数据,新列可能会“关闭”,因为新级别不会出现在新数据中。
我正在考虑执行以下操作:
dummies_df = pd.get_dummies(list_of_all_possible_levels)
dummies_df[:] = 0
dummies_df.drop(dummies_df.index[1:], inplace=True)
# If there are 10 levels this becomes a 10x10 Dataframe. I only need
# one 'empty' row and drop everything after the first.
# Let's say the DataFrame looks like this:
df['categorical_factor', 'numeric_factor', 'other_numeric_factor']
# I want to do something where I flag the column of the feature as 1
# and append the one-row dummies_df to each row of df
for cat in df.categorical_factor:
dummies_df[cat] = 1
df['numeric_factor', 'other_numeric_factor'] + dummies_df
我只是不知道是否应该像这样循环遍历行,还是有更好的“笛卡尔积”类型的答案。如果这是 R,我只会做 cbind(df, dummies_df),因为 R 知道回收 dummies_df 的值。
或者也许我应该在新数据上使用pandas.get_dummies,并将缺失的级别作为新列加入,如下所示:
new_dat['missing_level_1'] = [0 for _ in new_dat.index]
new_dat['missing_level_2'] = [0 for _ in new_dat.index]
编辑:示例数据
levels=['level_1', 'level_2', 'level_3']
A = [0,1,2]
B = [3,4,5]
df = pd.DataFrame({'levels': levels, 'A': A, 'B': B})
df = df.drop('levels', axis=1).join(pd.get_dummies(df.levels))
new_levels=['level_1', 'level_2', 'level_2']
new_A = [5,6,7]
new_B = [8,9,7]
new_df = pd.DataFrame({'levels': new_levels, 'A': new_A, 'B': new_B})
new_df = new_df.drop('levels', axis=1).join(pd.get_dummies(new_df.levels))
df 现在是
+---------+---+---+---------+---------+---------+
| (index) | A | B | level_1 | level_2 | level_3 |
+---------+---+---+---------+---------+---------+
| 0 | 0 | 3 | 1 | 0 | 0 |
| 1 | 1 | 4 | 0 | 1 | 0 |
| 2 | 2 | 5 | 0 | 0 | 1 |
+---------+---+---+---------+---------+---------+
new_df 现在是
+---------+---+---+---------+---------+
| (index) | A | B | level_1 | level_2 |
+---------+---+---+---------+---------+
| 0 | 5 | 8 | 1 | 0 |
| 1 | 6 | 9 | 0 | 1 |
| 2 | 7 | 7 | 0 | 1 |
+---------+---+---+---------+---------+
(它缺少level_3 列。)
我希望 new_df 成为
+---------+---+---+---------+---------+---------+
| (index) | A | B | level_1 | level_2 | level_3 |
+---------+---+---+---------+---------+---------+
| 0 | 5 | 8 | 1 | 0 | 0 |
| 1 | 6 | 9 | 0 | 1 | 0 |
| 2 | 7 | 7 | 0 | 1 | 0 |
+---------+---+---+---------+---------+---------+
【问题讨论】:
-
您可以在您的问题中添加示例数据吗?
-
你 new_levels 包含 level_2 两次而不是 level_3。纠正这一点,您将在 new_df 中获得 level_3
-
@Vaishali 重点是
new_dfDataFrame 中的 level_3 不是。new_df可以是 5000 条记录,但不包含级别level_3。 -
哦,所以你的意思是你需要一个新列 level_3 在 new_df 中,因为 level_3 不存在于列级别中,所以所有的零?
-
你考虑过特征散列吗?它将分类值映射到列索引,但您无需查看训练数据中所有可能的分类值。
标签: python pandas machine-learning scikit-learn one-hot-encoding