将列表的 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
除了 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