【问题标题】:python pandas one- hot encoding in several columns for the same questionpython pandas one-hot encoding in several columns for the same question
【发布时间】:2023-01-10 01:15:11
【问题描述】:

我必须对包含调查结果的数据帧执行一次性编码。

在这个数据框中,它们代表多列中的“多重响应”。例如,如果有人选择“1”和“3”,则第一列为“1”,第二列为“3”。

我需要像这样组织数据

Quesion1 Quesion1
1 3
2 4
1 5

-->

1 2 3 4 5
1 0 1 0 0
0 1 0 1 0
1 0 0 0 1

我尝试使用“get_dummies”进行一次性编码。但两列被视为不同的问题。 (第一个问题中的'2'和第二个问题中的'2'被视为不同的值)

有什么好的方案可以解决这个问题吗?

【问题讨论】:

    标签: python pandas one-hot-encoding


    【解决方案1】:
    >>> pd.get_dummies(df.stack()).groupby(level=0).sum().clip(upper=1)
    
       1  2  3  4  5
    0  1  0  1  0  0
    1  0  1  0  1  0
    2  1  0  0  0  1
    
    • stack将框架压平
    • 得到假人
    • groupby 每行(现在在 level=0)
    • 将 1 求和,但 max-clip 为 1 可能多次出现(即,问题的相同答案)

    【讨论】:

      【解决方案2】:

      您需要使用 .get_dummies() 将每一列转换为 one-hot,然后使用 pd.concat() 加入它们:

      pd.concat([pd.get_dummies(df.iloc[:,0]), pd.get_dummies(df.iloc[:,1])], axis=1)
      

      输出:

         1  2  3  4  5
      0  1  0  1  0  0
      1  0  1  0  1  0
      2  1  0  0  0  1
      

      【讨论】:

      • 实际上不是想要的输出
      • @Mustafa Aydın 现在使用更简单的方法是理想的结果。
      • 也许您可以进行列表理解或将其概括为任意数量的列
      【解决方案3】:

      使用stackcrosstab

      s = df.stack().droplevel(1)
      
      out = pd.crosstab(s.index, s).rename_axis(index=None, columns=None)
      

      输出:

         1  2  3  4  5
      0  1  0  1  0  0
      1  0  1  0  1  0
      2  1  0  0  0  1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-12
        • 1970-01-01
        • 2022-12-26
        • 2021-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-11
        相关资源
        最近更新 更多