【问题标题】:Convert categorical column into specific integers将分类列转换为特定整数
【发布时间】:2019-01-13 10:17:21
【问题描述】:

我有一堆数据框,其中一个分类列定义了性别 (M/F)。我想将整数 1 分配给男性,将 2 分配给女性。我有以下代码将它们编码为 0 和 1

df4["Sex"] = df4["Sex"].astype('category')
df4.dtypes
df4["Sex_cat"] = df4["Sex"].cat.codes
df4.head()  

但我特别需要 M 为 1,F 为 2。有没有一种简单的方法可以将特定整数分配给类别?

【问题讨论】:

  • 根据您的解释,您可以将1 添加到cat.codesdf4["Sex_cat"] = df4["Sex"].cat.codes + 1
  • @coldspeed 是的,当然。
  • @U9-Forward 抱歉,我正在写答案。
  • @coldspeed 大声笑,我的回答与 OP 更相似 :-)

标签: python pandas


【解决方案1】:

IIUC:

df4['Sex'] = df4['Sex'].map({'M':1,'F':2})

现在:

print(df4)

会是理想的结果。

【讨论】:

  • 地图解决方案需要一个扩展来优雅地处理多个类别(想想enumerate),astype('category') 的答案很危险,因为你把任务留给了 pandas,顺序通常是字典顺序的,无法控制.
  • @coldspeed 是的,我删除了那部分
  • 好多了。这就是为什么我从未在 cmets 中发布完整答案的原因,这就是为什么在举起一个之前你应该仔细考虑 ;-)
  • @coldspeed 大声笑,是的,用apply 添加了另一个,但效率较低。
  • 我建议删除它。
【解决方案2】:

如果需要强加特定的排序,可以使用pd.Categorical

c = pd.Categorical(df["Sex"], categories=['M','F'], ordered=True)

这确保“M”被赋予最小值,“F”被赋予下一个值,依此类推。然后您可以访问codes 并添加 1。

df['Sex_cat'] = c.codes + 1

如果您想更好地控制为哪些类别分配了哪些代码,则使用pd.Categorical 比使用astype('category') 更好。

【讨论】:

    【解决方案3】:

    您也可以将 lambda 与 apply 一起使用:

    df4['sex'] = df4['sex'].apply(lambda x : 1 if x=='M' else 2)
    

    【讨论】:

      猜你喜欢
      • 2018-03-19
      • 2021-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多