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

在Pandas中按列分组并创建哑变量列的实现方案咨询

问题描述

初始DataFrame定义如下:

import pandas as pd
df = pd.DataFrame({'col1':['a','b','c','a'],
                   'col3':['A','A','B','D']})

需求:按col1列分组,创建以col3中的值命名的新列(例如col3_A、col3_B),并用二进制值标记(1表示该值在对应分组中存在,0表示不存在),最终期望得到的结果如下:

pd.DataFrame({'col1':['a','b','c'],           
             'col3_A':[1,1,0],
              'col3_B':[0,0,1],
              'col3_D':[1,0,0]})

目前已写出代码:df.groupby('col1').agg(','.join).reset_index(),但不清楚后续如何生成目标二进制列。

解决方案

以下是几种高效的实现方式,无需处理字符串拆分:

方法1:使用pivot_table透视表

利用透视表的聚合功能判断值是否存在,再转换为整数格式,最后重命名列:

# 创建透视表,any判断是否存在,fill_value填充缺失值为0
result = df.pivot_table(index='col1', columns='col3', aggfunc='any', fill_value=0).astype(int)
# 给列名添加col3_前缀
result.columns = [f'col3_{col}' for col in result.columns]
# 重置索引,将col1从索引转为列
result = result.reset_index()

方法2:结合get_dummies与groupby

先对col3生成哑变量,再按col1分组取最大值(只要分组中出现过该值,结果即为1):

# 生成col3的哑变量,前缀设为col3
dummies = pd.get_dummies(df, columns=['col3'], prefix='col3')
# 按col1分组取最大值,重置索引
result = dummies.groupby('col1').max().reset_index()

方法3:使用crosstab交叉表

交叉表可以直接统计分组与值的对应关系,再转换为二进制标记:

# 创建交叉表,转换为布尔值后再转整数
result = pd.crosstab(df['col1'], df['col3']).astype(bool).astype(int)
# 重命名列
result.columns = [f'col3_{col}' for col in result.columns]
# 重置索引
result = result.reset_index()

内容的提问来源于stack exchange,提问作者frank

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 15:05:01