如何将Pandas用户名列高效转为数值数组?Keras方案咨询
最优实现:将用户名映射为整数并转换数据集格式
刚好遇到过类似的需求,针对你有100个用户名的场景,下面给你几个简洁高效的方案,覆盖纯数据预处理和Keras模型集成两种场景,顺便优化你构思的函数思路:
一、Pandas简洁实现(最推荐的纯预处理方案)
Pandas自带的factorize()方法专门用来处理类别型数据转整数映射,完全不需要手动写字典,100个用户名也能一键搞定:
import pandas as pd # 加载你的数据集(这里用示例数据演示) df = pd.DataFrame({ 'UserName': ['Peter', 'Richard', 'Peter'], 'exam': [1, 2, 2], 'score': [70, 80, 60] }) # 把UserName映射为从1开始的整数(默认从0开始,加1适配你的示例格式) df['UserName_id'] = df['UserName'].factorize()[0] + 1 # 生成你需要的逗号分隔格式 output_lines = df[['UserName_id', 'exam', 'score']].astype(str).agg(','.join, axis=1) # 输出结果 for line in output_lines: print(line)
运行后就会输出:
1,1,70 2,2,80 1,2,60
factorize()会自动给每个唯一用户名分配唯一ID,顺序是第一次出现的顺序,完全不需要你手动维护映射字典,处理100个用户名毫无压力。
二、Keras/TensorFlow集成方案(适合模型输入管道)
如果你的数据集要直接喂给Keras模型,用TensorFlow的StringLookup层更合适,它可以把映射逻辑整合到模型预处理流程中,不需要离线处理:
import tensorflow as tf # 模拟你的输入数据 user_names = tf.constant(['Peter', 'Richard', 'Peter']) exam = tf.constant([1, 2, 2]) score = tf.constant([70, 80, 60]) # 创建字符串转整数的映射层,输出从1开始(mask_token设为None避免0作为掩码) lookup_layer = tf.keras.layers.StringLookup( output_mode='int', mask_token=None, num_oov_indices=0 # 如果没有未知用户名可以设为0,有未知用户的话设为1 ) # 让层学习用户名的映射关系 lookup_layer.adapt(user_names) # 转换用户名为整数ID user_ids = lookup_layer(user_names) # 拼接成你需要的格式 result_lines = tf.strings.join( [tf.strings.as_string(user_ids), tf.strings.as_string(exam), tf.strings.as_string(score)], separator=',' ) # 打印结果 for line in result_lines.numpy(): print(line.decode('utf-8'))
这个方案的好处是可以直接和TF Dataset结合,在训练时动态处理数据,尤其适合大规模数据或者需要在线预处理的场景。
三、优化你的自定义函数思路
你构思的函数思路没问题,但可以用Python的字典推导式和Pandas的map()方法简化,更高效简洁:
def NameToInt(user_series): # 用字典推导式生成用户名到整数的映射(从1开始) name_map = {name: idx + 1 for idx, name in enumerate(user_series.unique())} # 批量转换整个列 return user_series.map(name_map) # 使用示例 df['UserName_id'] = NameToInt(df['UserName'])
这样既保留了你自定义映射的灵活性,又避免了冗余的循环append操作,处理100个用户名速度很快。
内容的提问来源于stack exchange,提问作者Kenneth Yeung
相关产品推荐
相关产品推荐

