在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
相关产品推荐
相关产品推荐

