代码之家  ›  专栏  ›  技术社区  ›  DaCard

如何将带有列表的列转换为一个热编码列?[副本]

  •  2
  • DaCard  · 技术社区  · 6 月前

    假设有一个DataFrame,如下所示

    import pandas as pd 
    import numpy as np 
    
    df = pd.DataFrame({'id':range(1,4), 
                       'items':[['A', 'B'], ['A', 'B', 'C'], ['A', 'C']]})
    df
            id  items
            1   [A, B]
            2   [A, B, C]
            3   [A, C]
    

    是否有有效的方法将上述DataFrame转换为以下(一个热编码列)?提前感谢!

       id   items       A   B   C
        1   [A, B]      1   1   0
        2   [A, B, C]   1   1   1
        3   [A, C]      1   0   1
    
    1 回复  |  直到 6 月前
        1
  •  2
  •   PaulS    6 月前

    解决方案1

    一种可能的解决方案,其步骤如下:

    • 首先 explode 函数用于将列表中的每个项目转换为行,复制索引值。

    • 那么 to_numpy 方法将得到的数据帧转换为numpy数组,以及 .T 转置此数组。

    • 这个 crosstab 函数计算一个简单的因子交叉表,在这种情况下,这些因子是分解数据帧的转置列。

    • 这个 reset_index 方法用于重置数据帧的索引,将索引转换为名为的列 id .

    • 最后,原始数据帧 df 使用 merge 功能。

    df.merge(
        pd.crosstab(*df.explode('items').to_numpy().T)
        .reset_index(names='id'))
    

    解决方案2

    另一种可能的解决方案,其步骤是:

    • 首先 爆炸 函数用于将列表中的每个项目转换为行,复制索引值。

    • 那么 pivot_table 函数用于根据中的唯一值重塑数据 items 列,汇总每个列的计数 身份证件 对于每一个 item The fill_value=0 确保任何缺失的组合都用零填充。

    • 这个 rename_axis 方法用于删除列的轴名称。

    • 最后, reset_index 被调用以重置数据帧的索引,将索引转换为列。

    • 原始数据帧 df 然后使用 合并 功能。

    df.merge(
        df.explode('items')
        .pivot_table(index='id', columns='items', values='id', aggfunc=len, 
                     fill_value=0)
        .rename_axis(None, axis=1).reset_index())
    

    输出:

       id      items  A  B  C
    0   1     [A, B]  1  1  0
    1   2  [A, B, C]  1  1  1
    2   3     [A, C]  1  0  1