如何按个体分组并基于特征列表转换Pandas DataFrame?
解决方法:将长格式特征数据转换为独热编码宽表
原代码问题分析
你的代码存在两处核心逻辑错误:
- 遍历对象错误:
pd.DataFrame[~ df.duplicated(subset=['id'])]写法不符合pandas语法,且实际遍历的是列名而非个体ID - 判断逻辑错误:
feature_list in df['feature'].unique()是将整个特征列表与全局唯一特征集合比较,而非针对单个个体的特征检查
正确实现方式
以下三种方法均能高效完成需求,推荐优先使用第一种:
方法1:使用pivot_table(最简方案)
import pandas as pd # 假设原始数据存储在df中,特征列表为feature_list df['flag'] = 1 # 标记该个体拥有此特征 # 生成透视表,自动填充缺失特征为0 result = df.pivot_table(index='ID', columns='特征', values='flag', fill_value=0) # 确保列顺序与特征列表完全一致 result = result[feature_list]
方法2:使用crosstab
import pandas as pd # 直接生成交叉表,统计每个个体的特征出现情况 result = pd.crosstab(df['ID'], df['特征']) # 对齐特征列表,缺失特征补0 result = result.reindex(columns=feature_list, fill_value=0)
方法3:分组+独热编码(灵活扩展方案)
import pandas as pd # 按ID分组,展开特征后生成独热编码 grouped = df.groupby('ID')['特征'].apply(pd.Series).stack() dummies = pd.get_dummies(grouped, prefix='', prefix_sep='').sum(level=0) # 对齐特征列表,缺失特征补0 result = dummies.reindex(columns=feature_list, fill_value=0)
说明
三种方法均无需手动嵌套循环,利用pandas内置函数实现高效转换,自动为个体拥有的特征标记1,未拥有的标记0;reindex操作确保结果列顺序与你提供的特征列表完全一致。
内容的提问来源于stack exchange,提问作者RicardoJP
相关产品推荐
相关产品推荐

