Pandas按id匹配特征,缺失值补0生成固定顺序特征向量
实现方案
用pandas内置的透视表功能就可以快速实现,不需要写循环遍历,代码可直接运行:
import pandas as pd # 原始输入数据 df = pd.DataFrame({ 'id': ['a', 'b', 'a', 'a', 'c', 'b'], 'feature': ['aa', 'ab', 'ab', 'cc', 'ab', 'bb'], 'value': [0.5, 0.1, 0.2, 0.3, 0.9, 1] }) # 指定的固定顺序特征列表 feature_list = ['aa', 'ab', 'cc', 'bb']
核心处理代码:
# 行转列,缺失特征补0,同时强制列顺序和给定的feature_list一致 pivot_res = df.pivot_table( index='id', columns='feature', values='value', aggfunc='sum', # 同id同特征有多条记录时用求和聚合,无重复时该参数不影响结果 fill_value=0 ).reindex(columns=feature_list, fill_value=0) # 组装成要求的输出格式 result = pd.DataFrame({ 'id': pivot_res.index, 'feature_vector': pivot_res.values.tolist() }).reset_index(drop=True)
输出结果完全匹配预期:
id feature_vector 0 a [0.5, 0.2, 0.3, 0] 1 b [0.0, 0.1, 0.0, 1.0] 2 c [0.0, 0.9, 0.0, 0.0]
注意点
- 如果数据里存在同一个id对应同一个feature多条记录的情况,把
aggfunc改成需要的聚合规则就行,比如取平均用'mean',取第一条用'first' - 必须加
reindex步骤,否则pandas生成透视表时会自动对特征名做排序,无法匹配指定的特征顺序 - 直接用
.values.tolist()批量转列表比逐行apply效率高很多,数据量大的时候优势很明显
内容的提问来源于stack exchange,提问作者Chris_007
相关产品推荐
相关产品推荐

