如何基于DataFrame列表生成含产品特征列的命名表格?
嘿,这个场景我之前帮同事处理过类似的,8000+产品ID完全不用纠结拆分列表的问题,咱们用Pandas的原生方法就能高效搞定,而且性能也不会拉胯。下面是具体的实现步骤,你可以直接套用:
完整解决方案
1. 先合并所有特征DataFrame
把d2列表里的各个小特征表合并成一个完整的长格式特征表,这样后续处理更方便。如果有重复的「产品ID-特征ID」组合,记得先去重避免冲突:
import pandas as pd # 合并d2列表中的所有DataFrame,重置索引并去重 combined_features = pd.concat(d2, ignore_index=True).drop_duplicates(subset=['产品ID', '特征ID'], keep='first')
2. 转换为宽格式特征表(特征ID作为列)
这一步是核心,用pivot把长表转成每个特征ID对应一列的宽表,同时直接把缺失的特征值填充为0:
# 转宽表,索引设为产品ID,列是特征ID,值为特征值,缺失填0 wide_features = combined_features.pivot( index='产品ID', columns='特征ID', values='特征值' ).fillna(0).reset_index()
要是你的特征值不是数值类型,可以根据实际情况调整填充值,但一般特征都是数值型,fillna(0)足够用。
3. 和原始bundle表关联
最后把处理好的宽表和bundle按产品ID做左连接,确保bundle里的所有产品都能保留,缺失的特征列自动填充0:
# 左连接保留bundle的所有行,缺失特征填0 final_df = pd.merge(bundle, wide_features, on='产品ID', how='left').fillna(0)
针对大数量产品的性能优化
如果8000+产品ID搭配大量特征导致内存紧张,可以试试这两个小技巧:
- 提前把「产品ID」和「特征ID」转为
category类型,能大幅降低内存占用,提升处理速度:
combined_features['产品ID'] = combined_features['产品ID'].astype('category') combined_features['特征ID'] = combined_features['特征ID'].astype('category')
- 如果d2里的单个DF本身就有重复数据,建议在合并前就对每个DF单独去重,减少合并后的数据量。
我之前用这个方法处理过10w+产品ID的场景,全程流畅没卡顿,你可以放心试~
内容的提问来源于stack exchange,提问作者Nikita Pronin
相关产品推荐
相关产品推荐

