我想知道在对数据集进行预处理后,如何跟踪原始数据集的列?
在下面的代码中,df_columns
会告诉我 df_array
中的列 0
是 A
,列 1
是 B
,以此类推…
然而,一旦我对分类列 B
进行编码,df_columns
就不再适用于跟踪 df_dummies
解决方案应该不受分类列位置的影响,无论是 A
、B
、C
还是 D
。我可以做一些繁琐的工作,不断更新 df_columns
字典…但这既不优雅也不“Pythonic”
此外…如何跟踪分类变量的含义?{0,0,1} 表示猫,{0,1,0} 表示狗,等等?
附注 – 我知道虚拟变量陷阱,在实际使用它来训练模型时,我会使用 df_dummies[:,1:]
。
回答:
你能确认未来的数据集是否会继续拥有相同的列名吗?如果我正确理解了你的问题,你所需要做的就是保存原始数据框中的 df_columns
,并用它来重新索引你的新数据框。
new_df_reindexed = new_df[df_columns]
为了回答你的其他问题,你可以使用 pandas 的 get_dummies()
函数对数据进行独热编码。使用 drop_first
参数来删除生成的一个列值,以避免虚拟变量陷阱。同时,保存独热编码数据框的列列表。
为了确保你的新/测试/保留数据集具有与模型训练时相同的列定义,
- 首先使用
get_dummies()
对新数据集进行独热编码。 - 使用 pandas 的
reindex
函数,将新数据框调整为与模型训练时使用的结构相同 –df.reindex(columns=train_one_hot_encode_col_list, axis="columns")
。 - 上述操作将为训练数据集中存在的但不在新数据集分类列中的分类列值创建虚拟变量列。
- 最后,使用上述方法删除新数据集中不存在于旧数据集中的任何列 –
test_df_reindexed = test_df_onehotencode[train_one_hot_encode_col_list]
如果你遵循这些步骤,你可以完全依赖原始列名列表,而不需要跟踪列位置或分类值定义。
我还建议你阅读以下内容以供进一步参考:Pandas 中的独热编码 – https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.get_dummies.html列重新索引 – https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.reindex.html