将列表的 pandas DataFrame 与列表列中的值组合成 "one-hot"

Combining a pandas DataFrame of lists, into a "one-hot" with values from a column of lists

除了 1 和 0 之外,我如何获得类似于 one-hot 编码的东西,从与标签大小相同的列表中返回值?

作为一个示例 DataFrame,使用 Sklearn 的 MultiLabelBinarizer 我可以转换以下列表的 DataFrame:

df = pd.DataFrame({'labels': [['A', 'B'], ['B', 'D', 'F'], 
                              ['A', 'C', 'D'], ['D', 'B']],
                   'values': [[13.2, 1.3], [7.9, 12, 3.2], 
                              [9.0, 1, 14.8], [3.1, 6.7]]})

      labels          values
0     [A, B]     [13.2, 1.3]
1  [B, D, F]  [7.9, 12, 3.2]
2  [A, C, D]  [9.0, 1, 14.8]
3     [D, B]      [3.1, 6.7]

mlb = MultiLabelBinarizer(sparse_output=True)

df = df.join(
    pd.DataFrame.sparse.from_spmatrix(
        mlb.fit_transform(df.pop('labels')),
        index=df.index,
        columns=mlb.classes_))

收件人:

           values  A  B  C  D  F
0     [13.2, 1.3]  1  1  0  0  0
1  [7.9, 12, 3.2]  0  1  0  1  1
2  [9.0, 1, 14.8]  1  0  1  1  0
3      [3.1, 6.7]  0  1  0  1  0

虽然我正在寻找一种方法来获得它:

    A     B     C     D     F
0   13.2  1.3   0     0     0
1   0     7.9   0     12.0  3.2
2   9.0   0     1.    14.8  0
3   0     6.7   0     3.1   0

创建示例数据

df = pd.DataFrame()
df['labels'] = [['A', 'B'], ['B', 'D', 'F'], ['A', 'C', 'D'], ['D', 'B']]
df['values'] = [[13.2, 1.3], [7.9, 12, 3.2], [9.0, 1, 14.8], [3.1, 6.7]]

列表理解以遍历每一行值并将它们组合起来创建一个字典

transform =  [dict(zip(label, value)) for label, value in zip(df['labels'], df['values'])]

将新数据放入数据框

new_df = pd.DataFrame(transform)

将 nan 替换为 0

new_df.replace(np.nan, 0)

你可以 explode + reset_index + pivot + fillna:

out = (pd.pivot(df.explode(df.columns.tolist()).reset_index(), 
                'index', 'labels', 'values')
       .fillna(0)
       .rename_axis(index=[None], columns=[None]))

输出:

      A    B  C     D    F
0  13.2  1.3  0   0.0  0.0
1   0.0  7.9  0  12.0  3.2
2   9.0  0.0  1  14.8  0.0
3   0.0  6.7  0   3.1  0.0