如何对数据框中独热编码(OHE)后的列按用户分组求和?
解决方案
方法一:Pandas原生组合操作(最简便)
先通过pd.get_dummies生成独热编码列,再按user分组求和,一步完成需求:
import pandas as pd # 构造原始数据框 df = pd.DataFrame({ 'user': [2, 2, 3], 'product': ['A', 'A', 'B'] }) # 生成独热编码并按user分组聚合求和 result = pd.get_dummies(df, columns=['product']).groupby('user').sum().reset_index() print(result)
输出结果:
user product_A product_B 0 2 2 0 1 3 0 1
方法二:交叉表直接统计频次
用pd.crosstab可以直接统计每个用户对应产品的出现次数,本质是一步实现分组+编码+求和:
# 生成交叉表 result = pd.crosstab(df['user'], df['product']).reset_index() # 补充未出现的product_c列(按需添加) result['product_c'] = 0 # 调整列顺序匹配期望格式 result = result[['user', 'product_A', 'product_B', 'product_c']] print(result)
方法三:适配Scikit-learn流水线(适合大规模数据场景)
如果需要融入机器学习工作流,可使用OneHotEncoder完成编码后再分组:
from sklearn.preprocessing import OneHotEncoder import pandas as pd # 初始化编码器 encoder = OneHotEncoder(sparse_output=False, categories='auto') # 对product列编码 encoded_data = encoder.fit_transform(df[['product']]) # 转成数据框并匹配列名 encoded_df = pd.DataFrame(encoded_data, columns=encoder.get_feature_names_out(['product'])) # 合并user列后分组求和 combined_df = pd.concat([df['user'], encoded_df], axis=1) result = combined_df.groupby('user').sum().reset_index() # 补充未出现的product_c列(按需添加) if 'product_c' not in result.columns: result['product_c'] = 0 print(result)
补充说明
- 方法一、二适合日常数据分析场景,代码简洁易读;
- 方法三适合需要对接模型训练的流水线场景;
- 多分类列场景下,只需调整
get_dummies的columns参数,或在交叉表中添加对应变量即可扩展。
内容的提问来源于stack exchange,提问作者titu84hh
相关产品推荐
相关产品推荐

