新手求助:如何为cluster_ids列唯一值生成对应0-1标识列
解决方法
你的问题出在get_y_value函数上——它硬编码了只判断cluster_ids是否等于0,不管循环里的j是哪个唯一值,所以每次生成的新列都是同一套结果。下面给你两种修改方案:
方案一:修改函数适配循环中的目标值
先把函数改成可以接收目标cluster_id参数的形式,然后在循环里把当前的j传进去:
# 修改后的函数 def get_y_value(cluster_id, target_id): return 1 if cluster_id == target_id else 0 # 循环创建列 iterator = 0 for j in df['cluster_ids'].unique(): col_name = f'Clid_{iterator}' # 使用lambda把当前j传给函数 df_xyz[col_name] = df['cluster_ids'].apply(lambda x: get_y_value(x, j)) iterator += 1
更简洁的写法可以不用单独定义函数,直接在循环里用pandas的比较方法:
iterator = 0 for j in df['cluster_ids'].unique(): col_name = f'Clid_{iterator}' # eq(j)判断是否等于j,astype(int)把布尔值转成1/0 df_xyz[col_name] = df['cluster_ids'].eq(j).astype(int) iterator += 1
方案二:用pandas内置方法一键生成(推荐)
pandas有专门处理这种哑变量的函数pd.get_dummies,不用写循环和函数,一行代码就能搞定所有需求:
import pandas as pd # 生成哑变量列,前缀设为Clid dummies = pd.get_dummies(df['cluster_ids'], prefix='Clid') # 把生成的列合并到原DataFrame df_xyz = pd.concat([df_xyz, dummies], axis=1)
这个方法会自动为每个唯一的cluster_id创建列,列名格式是Clid_<cluster_id值>,对应行取值1,其余行取值0,比手动写循环高效得多,也更不容易出错。
内容的提问来源于stack exchange,提问作者Deepika Chandrasekar
相关产品推荐
相关产品推荐

