Создать новый столбец для каждого уникального значения в существующем столбце и применить функцию к значениям нового столбца

я пытаюсь создать новый столбец для каждого уникального значения в столбце кластера_ids. Кроме того, в новом столбце значения должны быть 1 для соответствующего «cluster_id», который был создан, а остальные значения должны быть 0.

У меня ограниченный опыт кодирования. Я всего лишь новичок. Я попытался решить эту проблему, создав функцию, которая:

мой образец данныхизображение новых столбцов для каждого уникального кластера_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 для каждого уникального значения.

0
1
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решение 1

Если я правильно понял ваше намерение и использую 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. Вы передаете уникальные отсортированные кластеры в LabelBinarizer, а затем он присваивает 1 кластеру, который был в строке, и 0 остальным.

Решение 2

Вы также можете сделать это без каких-либо дополнительных зависимостей и намного проще с помощью pd.get_dummies

>>> pd.get_dummies(df["cluster_ids"]).astype(int)
   0  1  2  3  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

См. https://pandas.pydata.org/docs/reference/api/pandas.get_dummies.html для получения дополнительной информации.

Другие вопросы по теме