я пытаюсь создать новый столбец для каждого уникального значения в столбце кластера_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 для каждого уникального значения.
Если я правильно понял ваше намерение и использую 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 остальным.
Вы также можете сделать это без каких-либо дополнительных зависимостей и намного проще с помощью 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 для получения дополнительной информации.
print(df)