为现有列中的每个唯一值创建一个新列,以及如何将函数应用于新列的值

问题描述 投票:0回答:1

我正在尝试为 cluster_ids 列中的每个唯一值创建一个新列。此外,在新列中,其创建的相应“cluster_id”的值应为 1,其余值应为 0。

我的编码经验有限。我只是一个初学者。我尝试通过创建一个函数来解决这个问题:

my sample dataframe picture of new columns for each unique cluster_id

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 函数中每个唯一值的值提供一些建议,我将不胜感激。

pandas loops iterator
1个回答
0
投票

如果我理解了你的意图,并且使用

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。

© www.soinside.com 2019 - 2024. All rights reserved.