【问题标题】:Preserve column order while one-hot encoding using pandas.get_dummies使用 pandas.get_dummies 进行一次热编码时保留列顺序
【发布时间】:2019-04-04 15:51:22
【问题描述】:

在 Pandas 数据框中一次性编码分类特征的最佳/最 Pythonic 方法是什么,同时保留从中提取类别(新列名)的列的原始顺序?

例如,如果我的数据框 (df0) 中有三列:["Col_continuous"、"Col_categorical"、"Labels"],并且我使用

df1hot = pd.get_dummies(df0, columns = ["Col_categorical"])

新数据框的“标签”列之后显示了新创建的列。我想要“Col_continuous”和“Labels”之间的新列。

为了稳健性,我希望在处理具有在其余列中任意排序的分类列的数据帧时保留顺序例如,对于 ["Cont1", "Cat1", "Cont2", "Cont3", "Cat2 ", "Labels"],我希望由 "Cat1" 产生的新列位于 "Cont1" 和 "Cont2" 之间。假设我已经有一个变量,比如 categoricalCols,它是分类特征名称的列表。

编辑 1:感谢 Juan C 的评论,将 df1hot = pd.get_dummies(df0, columns = ["Col_continuous"]) 更改为 df1hot = pd.get_dummies(df0, columns = ["Col_categorical"])

编辑 2:添加以“为了稳健性,...”开头的段落

【问题讨论】:

  • 我猜你的意思是df1hot = pd.get_dummies(df0, columns = ["Col_categorical"])而不是df1hot = pd.get_dummies(df0, columns = ["Col_continuous"]),对吧?
  • 是的,我就是这个意思。谢谢!

标签: python pandas one-hot-encoding


【解决方案1】:

IIUC 我会选择这样的东西:

df.columns=['Col_continuous',*[i for i in df.columns if 'Col_categorical' in i], 'Labels']

这告诉 pandas 将 get_dummies 创建的每一列放在 df.columns 的中间

【讨论】:

  • 感谢您的回答。我在原始问题中添加了一段以解决我遇到的更普遍的问题。请查看您是否有 Pythonic 解决方案。
  • 我明白了。我能够做到这一点,但非常不符合蟒蛇。如果这对你有用,我不知道
【解决方案2】:

我不知道它是否足够 Pythonic,但以下代码是我发现解决更普遍问题的唯一方法:

df0['Col_categorical'] = pd.Categorical(df0['Col_categorical'])
dfDummies = pd.get_dummies(df0['Col_categorical'])
column_position = df0.columns.get_loc('Col_categorical')
df1 = df.iloc[:, :column_position]
df2 = df.iloc[:, column_position+1:]
df1hot = pd.concat([df1, dfDummies, df2], axis=1)

我得到分类列的列位置,然后我将原始数据帧拆分为两个数据帧,并在它们之间插入单热编码的列。

【讨论】:

    猜你喜欢
    • 2018-10-29
    • 2019-11-25
    • 2020-11-12
    • 1970-01-01
    • 2021-02-10
    • 2017-12-18
    • 2020-03-05
    相关资源
    最近更新 更多