我正在尝试为 cluster_ids 列中的每个唯一值创建一个新列。此外,在新列中,其创建的相应“cluster_id”的值应为 1,其余值应为 0。
我的编码经验有限。我只是一个初学者。我尝试通过创建一个函数来解决这个问题:
def get_y_value(cluster_ids): if cluster_ids == 0: return 1 else: return 0
下一步,我创建了一个 for 循环来迭代行,但新列的值是相同的。我认为这是因为“get_y_value”函数。
for j in (df['cluster_ids'].unique()): col_name = 'Clid' +"_"+ str(iterator) df_xyz.loc[:, col_name] = df['cluster_ids'].apply(get_y_value) iterator += 1
如果有人可以就如何更改 get_y_value 函数中每个唯一值的值提供一些建议,我将不胜感激。
如果我理解了你的意图,并且使用
scikit-learn
作为你的依赖项的一部分,那么效果很好:
import sklearn.preprocessing as skp
import pandas as pd
df = pd.DataFrame({"cluster_ids": [0, 1, 2, 3, 4, 0, 1, 2, 3]})
unique_clusters = df["cluster_ids"].sort_values().unique()
binarizer = skp.LabelBinarizer()
binarizer.fit(unique_clusters)
columns = [f"Clid_{i}" for i in unique_clusters]
print(pd.DataFrame(binarizer.transform(df["cluster_ids"]), columns=columns))
结果
Clid_0 Clid_1 Clid_2 Clid_3 Clid_4
0 1 0 0 0 0
1 0 1 0 0 0
2 0 0 1 0 0
3 0 0 0 1 0
4 0 0 0 0 1
5 1 0 0 0 0
6 0 1 0 0 0
7 0 0 1 0 0
8 0 0 0 1 0
它使用 LabelBinarizer 基本上执行基于唯一
cluster_id
的 one-hot 编码。您将唯一排序的簇传递给 LabelBinarizer
,然后它为该行上的簇分配 1,为其他簇分配 0。