【问题标题】:Transform Hot Encoding转换热编码
【发布时间】:2021-07-14 08:58:12
【问题描述】:

我有这个数据;

ID   Month
001  June
001  July
001  August
002  July

我希望结果是这样的:

ID   June  July  August
001   1     1      1
002   0     1      0

我试过one-hot encoding,我的查询是这样的:

one_hot = pd.get_dummies(frame['month'])
frame = frame.drop('Month',axis = 1)
frame = frame.join(one_hot)

但是结果是这样的

ID   June  July  August
001   1     0      0
001   0     1      0
001   0     0      1
002   0     1      0

我可以知道我的查询的哪一部分是错误的吗?

【问题讨论】:

  • 你想要的不是 one-hot encoding,顾名思义,每行有一个高位 (1)
  • 如果第一个 July 更改为 June,预期输出是什么?

标签: python pandas numpy transform one-hot-encoding


【解决方案1】:

get_dummies返回严格的1-hot编码值,你可以使用pd.crosstab

>>> out = pd.crosstab(df.ID, df.Month)
>>> out

Month  August  July  June
ID
1           1     1     1
2           0     1     0

为了保持月份的出现顺序,您可以reindex

>>> out.reindex(df.Month.unique(), axis=1)

Month  June  July  August
ID
1         1     1       1
2         0     1       0

如果一个 ID 可以关联超过 1 个月并且您希望将其视为 1:

out = out.ne(0).astype(int)

以后可以使用。

【讨论】:

  • 你确定 OP 需要计数吗?
  • 不确定,但我怀疑他们尝试get_dummies 和 ID-Month 对似乎是独一无二的。添加了解决方法。
  • 是的,热编码返回0,1,所以crosstab 这是个坏主意(但如果使用 out.ne(0).astype(int) 它可以工作,但在我看来过于复杂)
【解决方案2】:

如果需要热编码,将ID 转换为索引并聚合max 以获得始终0,1 输出:

one_hot = (pd.get_dummies(frame.set_index('ID')['Month'])
             .max(level=0)
             .reindex(df.Month.unique(), axis=1))
print (one_hot)
    June  July  August
ID                    
1      1     1       1
2      0     1       0

【讨论】:

    猜你喜欢
    • 2017-09-21
    • 2019-09-06
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 2018-01-15
    • 2019-10-24
    相关资源
    最近更新 更多