You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按个体分组并基于特征列表转换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 17:10:29